モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

運用時に大活躍する必須コマンド

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/05/26
最終更新最終更新
2021/09/07
記事区分記事区分
一般公開

ファイル内容を再帰的に検索 (grep)

find コマンドはファイル名についてディレクトリを再帰的に検索します。ファイルの内容について指定したディレクトリ以下を再帰的に検索するためには grep に -r オプションを付与します。その際 -n および -i オプションも付与しておくと便利です。未来創発 NRI grep です。

$ grep -nri "pattern" dir
  • -n (--line-number) 検索結果がファイルの何行目であったかを表示
  • -r (--recursive) ディレクトリ以下を再帰的に検索
  • -i (--ignore-case) 正規表現の大文字小文字を区別しない

特定のディレクトリを除外するためには --exclude-dir を指定します。.gitlog ディレクトリを除外して example.com という文字列が含まれるファイルを検索する例は以下のようになります。

$ grep -nri 'example.com' . --exclude-dir './.git' --exclude-dir './log'

高速な grep (silver → Ag)

インストール (macOS, debian)

brew install the_silver_searcher
sudo apt install silversearcher-ag

ディレクトリ以下を検索 (grep -nr)

ag 'xxx' .

gz 圧縮を展開して検索 (zgrep)

ag -z 'xxx' .

いい感じに無視している .git や隠しファイルを無視せずに検索

ag -u 'xxx' .

ファイル名だけ表示 (grep -l)

ag -l 'xxx' .
ag -L 'xxx' . # マッチしなかったファイル

ファイル名に対して検索

ag -g 'filename' .

インクリメンタルサーチ grep (peco)

OS に応じたバイナリファイルをダウンロードして使います。設定ファイルのカスタマイズがなされていない状況であっても、ログ閲覧時に grep や less の代用として有用です。

sudo cat /var/log/messages | peco

特定のディレクトリを除外してファイル名を検索 (find)

.gitlog ディレクトリを除外して *.log ファイルを検索する例は以下のようになります。-o は「または (or)」の意味です。-prune を使用する必要はありません。

$ find . -not \( -path './.git/*' -o -path './log/*' \) -name '*.log'

高速な find (locate)

インストール (macOS、CentOS、Debian)

brew install findutils

sudo yum install mlocate
rpm -ql mlocate

sudo apt install mlocate
dpkg -L mlocate

インデックスの更新

sudo gupdatedb

sudo rm /var/lib/mlocate/mlocate.db
sudo updatedb

cron によるインデックス更新

less /etc/cron.daily/mlocate

検索 (-r 正規表現)

glocate xxxx.txt
locate -r xxxx.txt$

タイムスタンプ順に並べる (ls)

  • -t 変更日時順に並べます
  • -r 逆順に並べます

新しい順

$ ls -lt /etc/
...
-rw-r--r--.  1 root root    233  1月 12 22:28 2010 printcap
-rw-r--r--.  1 root root   6455  1月 12 22:28 2010 protocols
-rw-------.  1 root root    122  1月 12 22:28 2010 securetty
-rw-r--r--.  1 root root    767 11月 30 23:04 2009 netconfig
-rw-r--r--.  1 root root    148  5月 15 05:53 2009 asound.conf
-rw-r--r--.  1 root root    662  8月 29 16:19 2007 logrotate.conf

古い順

$ ls -ltr /etc/
...
drwxr-xr-x.  2 root root   4096  3月 28 21:50 2015 bash_completion.d
drwxr-xr-x.  2 root root   4096  3月 28 21:50 2015 default
-rw-r--r--.  1 root root  26141  3月 28 21:50 2015 ld.so.cache
drwxr-xr-x.  2 root root   4096  3月 28 21:51 2015 profile.d
drwxr-xr-x.  2 root root   4096  4月 16 22:50 2015 logrotate.d
drwxr-xr-x.  7 root root   4096  4月 16 22:50 2015 sysconfig

gzip 圧縮されたファイルを閲覧 (zless)

以下の二つのコマンドは同等の効果をもたらします。似たコマンドに zcat, zdiff, zgrep などがあります。

$ zcat file.txt.gz | less
$ zless file.txt.gz

gzip 圧縮されたファイルを解凍 (gunzip)

$ gunzip file.txt.gz
(or $ gzip -d file.txt.gz)

マルチコアで高速に gzip 圧縮/解凍 する (pigz, unpigz)

インストール

sudo yum install epel-release
sudo yum --enablerepo=epel install pigz

圧縮

pigz somefile.txt

解凍

unpigz somefile.txt.gz
pigz -d somefile.txt.gz

less で閲覧中に tailf モードに切り替える (Shift f)

less コマンドで閲覧中に Shift f すると tailf モードの切り替わります。

$ less file.txt

つまり以下のコマンドと同等の効果が得られます。

$ tailf file.txt
$ tail -f file.txt

終了するためには Ctrl-C を押します。通常の閲覧モード less に戻ります。

その他 less オプション

ログファイル等に ANSI カラーのエスケープシーケンスが含まれている場合は -R を付与すると色付きで閲覧できます。

less -R /path/to/ansi-color-logfile.txt

長い一行を折り返さずに切り捨てて閲覧するためには -S を付与します。

less -S /path/to/long-lines-logfile.txt

JVM のプロセスを調査 (jps)

jdk に含まれる jps (Java Virtual Machine Process Status Tool) コマンドを利用すると JVM に限定して ps コマンドのような処理を実行できます。

$ jps -m
3002 /opt/jdk1.7.0/demo/jfc/Java2D/Java2Demo.JAR
3102 sun.tools.jstatd.jstatd -p 2002
  • -m : 実行時に渡された引数を表示

条件に合致した行以降も表示する (grep)

sample.txt

AAA 1
BBB 2
CCC 3
DDD 4
EEE 5

実行例

$ grep -A 2 'BBB' sample.txt
BBB 2
CCC 3
DDD 4

条件に合致した "BBB 2" だけでなく、それより後 (After) の二行も表示されました。

数秒毎にコマンドを定期実行 (watch)

1秒毎に "date" コマンドを実行し、その差異をハイライトして出力するためには以下のように "watch" コマンドを利用するとよいです。

$ watch -d -n 1 date

表示例

Every 1.0s: date                           Sun Oct 19 23:49:01 2014

2014年 10月 19日 日曜日 23:49:01 JST

DNSの情報を調査する (dig)

インストール例

$ sudo yum install bind-utils

実行例

$ dig yahoo.co.jp

実行結果例

...(略
;; ANSWER SECTION:
yahoo.co.jp.            79      IN      A       182.22.59.229
yahoo.co.jp.            79      IN      A       183.79.135.206
...(略

Windows 版は BIND を管理維持している ISC (Internet Systems Consortium) のサイトの Downloads → BIND からダウンロードできます。BIND 9.10.2 Documentation によると nslookup よりも dig を利用することが推奨されています。しかしながら、ちょっとした調査目的であればわざわざ dig をインストールしなくても Windows には標準で nslookup が用意されています。

$ nslookup yahoo.co.jp
権限のない回答:
サーバー:  aterm.me
Address:   192.168.179.1

名前:      yahoo.co.jp
Addresses: 183.79.135.206
           182.22.59.229

dig は既定では /etc/resolv.conf に記載の search を利用せずに名前解決します。search を有効にするためには以下のようにします。

dig +search yahoo.co.jp

ユーザをグループに所属させる (usermod/id)

コマンド id で現在の所属グループを表示できます。

$ id username
uid=500(username) gid=500(username) 所属グループ=500(username)

コマンド usermod で所属グループを追加します。

$ sudo usermod -aG wheel username
$ id username
uid=500(username) gid=500(username) 所属グループ=500(username),10(wheel)

所属グループを削除するためには append (-a) オプションを外します。自分のグループ username だけに所属させます。以下の例で一つ目 username はグループ名です。

$ sudo usermod -G username username
$ id username
uid=500(username) gid=500(username) 所属グループ=500(username)

ターミナルとファイルの両方に出力する (tee)

標準出力のみファイルにも出力するためには以下のようにします。

$ echo '123' | tee log.txt

リダイレクションによって標準エラー出力もファイルに出力できます。

$ echo '123' 2>&1 | tee log.txt

ファイルに追記するためには -a オプションを追加します。

$ echo '123' 2>&1 | tee -a log.txt

フォーマットされた時刻の文字列を得る (date)

$ date -d 'yesterday' +'%Y-%m-%d %H:%M:%S' -u
2015-05-29 23:38:02

オプション -u は UTC を指定したい場合に付与します。

UNIX 時間の値と日付を相互変換する (date)

$ date -d '@1430681351'
2015年  5月  4日 月曜日 04:29:11 JST
$ date -d '2015-05-04 04:29:11' +'%s'
1430681351

HTTP の疎通確認を行う (curl)

プログレス情報を非表示

$ curl http://www.example.com/ -s

ヘッダー情報の表示

$ curl http://www.example.com/ -I

認証

$ curl http://www.example.com/ -u username:password
$ curl http://www.example.com/ -u username
Enter host password for user 'username':

$ curl http://username:password@www.example.com/

オレオレ証明書などの承諾 (--insecure)

$ curl https://www.example.com/ -k

別のサーバを経由 (HTTP ではなく TCP でのプロキシサーバの場合は nc 等を併用します)

$ curl http://www.example.com/ -x http://proxy.abc.com/

別のサーバを経由しないで強制的に直接アクセス

$ curl http://www.example.com/ --noproxy www.example.com

リダイレクト (301, 302 など) が返されたら、その内容で再度リクエストを行う

$ curl -L http://www.example.com/

HTTP POST の実行 (パラメータ指定の方法がいくつかあります)

$ curl http://www.example.com/ -XPOST -d 'key=value'

$ cat file.txt
key=value
$ curl http://www.example.com/ -XPOST -d @file.txt

$ echo 'key=value' | curl http://www.example.com/ -XPOST -d @-

タイムアウトの設定

  • --connect-timeout 10 接続までのタイムアウト秒
  • --max-time 10 レスポンスが完了するまでのタイムアウト秒

HTTP ステータスコードを処理 (curl -w)

bashで HTTP 2xx でない場合に exit 1 する例は以下のようになります。

#!/bin/sh
STATUS_CODE=$(curl -sS -w '%{http_code}' www.example.com -o /dev/null)
if [[ ! "${STATUS_CODE}" =~ 2[0-9]{2} ]]; then
    echo "Got ${STATUS_CODE}"
    exit 1
fi

/etc/hosts を書き換えずに curl

curl --resolve my.example.com:80:93.184.216.34 http://my.example.com

ソート (sort)

sample.txt

1 CCC=y
2 BBB=z
3 AAA=x

空白区切り二列目でソート

$ cat sample.txt | sort -k2
3 AAA=x
2 BBB=z
1 CCC=y

= 区切り二列目でソート

$ cat sample.txt | sort -k2 -t'='
3 AAA=x
1 CCC=y
2 BBB=z

find exec のように '{}' の場所を xargs で指定する (-I オプション)

echo -e '1\n2\n3' | xargs -I{} touch '{}.txt'

find -exec で複数回数 {} を指定する

/bin/bash を exec することで実現できます。

find . -type f -exec /bin/bash -c "basename {} && dirname {}" \;

起動した後でバックグラウンドに処理を移す (bg)

コマンドを実行した後で、時間がかかることに気づいたとします。

$ sleep 10

Ctrl-z を押して一時中断します。

$ jobs
[1]+  停止                  sleep 10

バッググラウンドで起動します。

$ bg 1
$ jobs
[1]+  実行中               sleep 10 &

行を文字で区切る (awk)

単純な例

$ echo -e '1 2\n3 4' | awk '{ print $1 }'
1
3
$ echo -e '1 2\n3 4' | awk '{ print $2 }'
2
4

四則演算

$ echo -e '1 2\n3 4' | awk '{ print $1 + $2 }'
3
7

区切り文字を指定

$ echo -e '1,2\n3,4' | awk -F, '{ print $1 }'
1
3
$ echo -e '1\t2\n3\t4' | awk -F'\t' '{ print $1 }'
1
3

書式指定

$ echo -e '1,2\n3,4' | awk -F, '{ printf("%s,%s\n",$2,$1) }'
2,1
4,3

同じような処理は後述の perl や cut でも実現できます。

cut コマンド

$ echo -e '1 2\n3 4' | cut -d' ' -f1
1
3

ワンライナー (perl)

xargs 等では表現できない複雑なパイプ処理においては Perl ワンライナーが便利です。Perl がインストールされている環境は多く、また挙動が環境に依存しないため、汎用的なコマンドが作成できます。複数オプションの最後に e を指定することに注意します。

e → 引数文字列を Perl スクリプトとして評価します。

perl -e 'print "hi\n"'
hi

l$_ の末尾の改行文字が除去 (chomp) されます。また、すべての print 関数で改行文字が自動付与されます。

echo -e '1 2\n3 4' | perl -lne 'print $_'
1 2
3 4
echo -e '1 2\n3 4' | perl -ne 'chomp($_); print $_'
1 23 4

n → パイプで渡された標準入力からの文字列を $_ に格納します。

echo -e '1 2\n3 4' | perl -lne 'print $_'
1 2
3 4

p → パイプで渡された標準入力からの文字列を $_ に格納します。明示的に print を記述していなくても $_ が print されます。ワンライナーでは一般に n または p のどちらかを利用します。

echo -e '1 2\n3 4' | perl -lpe '$_ .= "xxx"'
1 2xxx
3 4xxx

a → 前述 AWK のような挙動になります。$_-F の区切り文字で分割 (split) した結果が @F に格納されています。$_ の値が必要なため n または p のどちらかと併用します。-Fa よりも前に指定します。

echo -e '1 2\n3 4' | perl -lape '$_ = $F[0]'
1
3
echo -e '1,2\n3,4' | perl -F, -lape '$_ = $F[0]'
1
3

s → 環境変数を利用することができます。

MY_ENV="aaa"
perl -se 'print "$MY_ENV\n"' -- -MY_ENV=$MY_ENV
aaa

xargs の代用

qq{} でダブルクォーテーションを表現できます。

echo -e '1 2\n3 4' | perl -lne 'system qq{echo $_}'
1 2
3 4

nkf の代用

-M でモジュールを use できます。

cat sjis.txt | perl -MEncode -lne 'print Encode::encode("UTF-8", Encode::decode("Shift_JIS", $_))' > utf8.txt

systemctl

サービス一覧

systemctl list-unit-files --no-pager -t service | grep nginx

自動起動の有無

systemctl is-enabled nginx.service

自動起動の設定変更

sudo systemctl enable nginx.service
sudo systemctl disable nginx.service

サービス操作

systemctl status nginx.service
sudo systemctl stop nginx.service
sudo systemctl start nginx.service
sudo systemctl restart nginx.service
Likeボタン(off)0
詳細設定を開く/閉じる
アカウント プロフィール画像

Software Engineer @ Tokyo

記事の執筆者にステッカーを贈る

有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

>>さらに詳しくステッカーを贈る
ステッカーを贈る コンセプト画像

Feedbacks

Feedbacks コンセプト画像

    ログインするとコメントを投稿できます。

    ログインする

    関連記事

    • 使い所が難しいマイナーな運用コマンド
      コマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin /...
      けんちゃんけんちゃん11/1/2022に更新
      いいねアイコン画像0
    • ipコマンドの基本的な使い方
      ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
      こもれびさんこもれびさん2/8/2017に更新
      いいねアイコン画像0
    • プロセス関連のコマンド
      サムネイル画像-7b5901f600
      プロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
      kenken11/27/2021に更新
      いいねアイコン画像0
    • rpmとyumのチートシート
      サムネイル画像-f69c6665b8
      rpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
      まるたんまるたん2/2/2022に更新
      いいねアイコン画像0
    • メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識
      メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...
      しおまめしおまめ8/30/2017に更新
      いいねアイコン画像0