ファイル内容を再帰的に検索 (grep)
find コマンドはファイル名についてディレクトリを再帰的に検索します。ファイルの内容について指定したディレクトリ以下を再帰的に検索するためには grep に -r オプションを付与します。その際 -n および -i オプションも付与しておくと便利です。未来創発 NRI grep です。
$ grep -nri "pattern" dir
- -n (--line-number) 検索結果がファイルの何行目であったかを表示
- -r (--recursive) ディレクトリ以下を再帰的に検索
- -i (--ignore-case) 正規表現の大文字小文字を区別しない
特定のディレクトリを除外するためには --exclude-dir
を指定します。.git
と log
ディレクトリを除外して 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)
.git
と log
ディレクトリを除外して *.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
のどちらかと併用します。-F
は a
よりも前に指定します。
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
関連記事
- 使い所が難しいマイナーな運用コマンドコマンドのエイリアスを登録する (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 /...
- ipコマンドの基本的な使い方ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
- プロセス関連のコマンドプロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
- rpmとyumのチートシートrpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
- メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...