8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-19

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]

8
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?