Linux文字列加工の具体例(sed,awk,xargs,cutなど)

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]