sed,awk,xargs,cutなどの文字列処理
こんなときのための具体例
・文字列加工をやりたい。
・コマンドとオプションを調べたけどいまいちわからない。
・いちいちパターンを試してられないし、試すパターンもわからない。
[sed]
■すべてのabcをijkに置換する
$ echo abcxyzabcxyz | sed 's/abc/ijk/g'
ijkxyzijkxyz
■最初のabcをijkに置換する
$ echo abcxyzabcxyz | sed 's/abc/ijk/'
ijkxyzabcxyz
[awk]
■文字列Aを含む行から文字列Bを含む行までを表示する
awk /文字列A/,/文字列B/
$ echo "aaa\nbbb\nccc\nddd"
aaa
bbb
ccc
ddd
$ echo "aaa\nbbb\nccc\nddd" | awk /bbb/,/ccc/
bbb
ccc
$ echo "aaa\nbbb\nccc\nddd" | awk /bbb/,/ddd/
bbb
ccc
ddd
■特定の列のみ表示する
# head -10 /var/log/messages
Jun 18 04:15:11 sample_host01 [info] systemd-logind: New session 847248 of user root.
Jun 18 04:15:11 sample_host01 [info] systemd-logind: Removed session 847248.
Jun 18 04:16:11 sample_host01 [info] systemd-logind: New session 847252 of user root.
Jun 18 04:16:12 sample_host01 [info] systemd-logind: Removed session 847252.
Jun 18 04:17:11 sample_host01 [info] systemd-logind: New session 847256 of user root.
Jun 18 04:17:11 sample_host01 [info] systemd-logind: Removed session 847256.
Jun 18 04:18:11 sample_host01 [info] systemd-logind: New session 847260 of user root.
Jun 18 04:18:11 sample_host01 [info] systemd-logind: Removed session 847260.
Jun 18 04:19:11 sample_host01 [info] systemd-logind: New session 847265 of user root.
Jun 18 04:19:12 sample_host01 [info] systemd-logind: Removed session 847265.
# head -20 /var/log/messages | awk '{print $4,$6,$7,$8}'
sample_host01 systemd-logind: New session
sample_host01 systemd-logind: Removed session
sample_host01 systemd-logind: New session
sample_host01 systemd-logind: Removed session
sample_host01 systemd-logind: New session
sample_host01 systemd-logind: Removed session
sample_host01 systemd-logind: New session
sample_host01 systemd-logind: Removed session
sample_host01 systemd-logind: New session
sample_host01 systemd-logind: Removed session
[xargs]
■findで見つけたファイルそれぞれに対してls -lの結果を表示する
$ find . -name "*.txt" | xargs ls -l
$ ll
total 0
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 a1.txt
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 a2.txt
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 a3.txt
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 b1.dat
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 b2.dat
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 b3.dat
-rw-r--r-- 1 user01 group01 0 Jun 18 21:36 c1.log
-rw-r--r-- 1 user01 group01 0 Jun 18 21:36 c2.log
-rw-r--r-- 1 user01 group01 0 Jun 18 21:36 c3.log
$ find . -name "*.txt"
./a1.txt
./a2.txt
./a3.txt
$ find . -name "*.txt" | xargs ls -l
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 ./a1.txt
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 ./a2.txt
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 ./a3.txt
[cut]
■半角スペースを区切り文字として、必要な列のみ取り出す
$ ls -l
total 0
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 a1.txt
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 a2.txt
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 a3.txt
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 b1.dat
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 b2.dat
-rw-r--r-- 1 user01 group01 0 Jun 18 21:35 b3.dat
-rw-r--r-- 1 user01 group01 0 Jun 18 21:36 c1.log
-rw-r--r-- 1 user01 group01 0 Jun 18 21:36 c2.log
-rw-r--r-- 1 user01 group01 0 Jun 18 21:36 c3.log
$ ls -l | cut -d " " -f 3
user01
user01
user01
user01
user01
user01
user01
user01
user01
$ ls -l | cut -d " " -f 3-5
user01 group01 0
user01 group01 0
user01 group01 0
user01 group01 0
user01 group01 0
user01 group01 0
user01 group01 0
user01 group01 0
user01 group01 0
↑連続列指定もできる
$ ls -l | cut -d " " -f 3,5
user01 0
user01 0
user01 0
user01 0
user01 0
user01 0
user01 0
user01 0
user01 0
↑飛び飛びの列指定もできる
■n行目以降を表示する
$ top | tail -n +7
TOPの結果からプロセス状態のみを表示する。更新されると意味ないけど。
■区切りとして複数入っている半角スペースを1つにまとめる
$ps -ef | tail -n +7 | sed 's/\s\+/ /g'
■PIDとコマンドのみを取得する
$ ps -ef | sed 's/\s+/ /g' | cut -d " " -f 2,8-20
コマンドに半角スペースが含まれていることがあるため8-20は8列目以降という意味
$ ps -ef | sed 's/\s+/ /g' | cut -d " " -f 2,8-20
PID CMD
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 [kthreadd]
3 [ksoftirqd/0]
5 [kworker/0:0H]
※psから必要な項目だけ抜き出すならpsの-oオプションを使ったほうが楽にできる
#ps -e -o pid,cmd
PID CMD
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 [kthreadd]
3 [ksoftirqd/0]
5 [kworker/0:0H]