運用時に大活躍する必須コマンド
[History] [Last Modified] (2019/01/15 07:18:53)
Recent posts
What is this site?
A platform for makers to share their knowledge.

Share your robots/products with others.
New robots/products

ファイル内容を再帰的に検索 (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
Related pages
    概要 Puma は Ruby/Rack アプリケーションのための HTTP サーバです。Rails の場合に関する使用方法をまとめます。 事前準備 JRuby のインストール こちらのページを参考にして rbenv による ruby インストールを行います。公式ページによると、パフォーマンスを最大限に引き出すためには正式にスレッドをサポートしている Rubinius または
    概要 JVM 実行中に java.lang.OutOfMemoryError: Java heap space または java.lang.OutOfMemoryError: GC overhead limit exceeded が出力された場合の対応方法のひとつをまとめます。 jstat コマンドで JVM のメモリ使用状況を把握
    概要 sttyコマンドを用いることで、ユーザー入力のエコーバックのON/OFFを切り替えることができます。 sample.sh #!/bin/sh stty -echo echo 'Type something: \c' read STR stty echo echo '\nYou typed:' STR 実行例
    概要 データ可視化ツールの一つ Grafana の簡単な使い方を把握します。 Grafana Documentation インストール APT APT レポジトリを追加します。 sudo vim /etc/apt/sources.list.d/grafana.list deb https://packagecloud.io/grafana/stable/debian/ stretch
    概要 LDAP の実装の一つ OpenLDAP について、簡単なコマンドサンプルを記載します。 インストール LDAP サーバ slapd (Standalone LDAP Daemon) sudo yum install openldap-servers sudo apt install slapd LDAP クライアントコマンドのインストール