find -exec
で複数回数 {}
を指定する
find コマンドはファイル名についてディレクトリを再帰的に検索します。ファイルの内容について指定したディレクトリ以下を再帰的に検索するためには grep に -r オプションを付与します。その際 -n および -i オプションも付与しておくと便利です。未来創発 NRI grep です。
$ grep -nri "pattern" dir
特定のディレクトリを除外するためには --exclude-dir
を指定します。.git
と log
ディレクトリを除外して example.com
という文字列が含まれるファイルを検索する例は以下のようになります。
$ grep -nri 'example.com' . --exclude-dir './.git' --exclude-dir './log'
インストール (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' .
OS に応じたバイナリファイルをダウンロードして使います。デフォルトのキーバインドは『知らないと損しているシェルのキーバインド』に記載したものとよく似ています。設定ファイルのカスタマイズがなされていない状況であっても、ログ閲覧時に grep や less の代用として有用です。
sudo cat /var/log/messages | peco
.git
と log
ディレクトリを除外して *.log
ファイルを検索する例は以下のようになります。-o
は「または (or)」の意味です。-prune
を使用する必要はありません。
$ find . -not \( -path './.git/*' -o -path './log/*' \) -name '*.log'
インストール (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 -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
以下の二つのコマンドは同等の効果をもたらします。似たコマンドに zcat
, zdiff
, zgrep
などがあります。
$ zcat file.txt.gz | less
$ zless file.txt.gz
$ gunzip file.txt.gz
(or $ gzip -d file.txt.gz)
インストール
sudo yum install epel-release
sudo yum --enablerepo=epel install pigz
圧縮
pigz somefile.txt
解凍
unpigz somefile.txt.gz
pigz -d somefile.txt.gz
less コマンドで閲覧中に Shift f
すると tailf モードの切り替わります。
$ less file.txt
つまり以下のコマンドと同等の効果が得られます。
$ tailf file.txt
$ tail -f file.txt
終了するためには Ctrl-C を押します。通常の閲覧モード less に戻ります。
ログファイル等に ANSI カラーのエスケープシーケンスが含まれている場合は -R
を付与すると色付きで閲覧できます。
less -R /path/to/ansi-color-logfile.txt
長い一行を折り返さずに切り捨てて閲覧するためには -S
を付与します。
less -S /path/to/long-lines-logfile.txt
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
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) の二行も表示されました。
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
インストール例
$ 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
コマンド 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)
標準出力のみファイルにも出力するためには以下のようにします。
$ echo '123' | tee log.txt
リダイレクションによって標準エラー出力もファイルに出力できます。
$ echo '123' 2>&1 | tee log.txt
ファイルに追記するためには -a オプションを追加します。
$ echo '123' 2>&1 | tee -a log.txt
$ date -d 'yesterday' +'%Y-%m-%d %H:%M:%S' -u
2015-05-29 23:38:02
オプション -u は UTC を指定したい場合に付与します。
$ date -d '@1430681351'
2015年 5月 4日 月曜日 04:29:11 JST
$ date -d '2015-05-04 04:29:11' +'%s'
1430681351
プログレス情報を非表示
$ 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
レスポンスが完了するまでのタイムアウト秒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
curl --resolve my.example.com:80:93.184.216.34 http://my.example.com
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
echo -e '1\n2\n3' | xargs -I{} touch '{}.txt'
find -exec
で複数回数 {}
を指定する/bin/bash
を exec することで実現できます。
find . -type f -exec /bin/bash -c "basename {} && dirname {}" \;