hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

sedコマンドの使い方



1 はじめに

sed(stream editor)の使い方をまとめました。sedはテキスト処理用コマンドです。テキストの中の文字列を削除したり、変換したりすることができます。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

sedの版数は以下のとおりです。

[root@server ~]# sed --version
sed (GNU sed) 4.2.2
-snip-

3 行を削除(d)する方法

テスト用ファイルを作成します。

[root@server ~]# cat test.txt
111
222
333
444
555

1行目を削除してみます。1行目が削除されたことがわかります。

[root@server ~]# sed '1d' test.txt
222
333
444
555

3行目から4行目を削除してみます。3行目から4行目が削除されたことがわかります。

[root@server ~]# sed '3,4d' test.txt
111
222
555

3行目から最終行までを削除してみます。最終行は$を指定します。3行目から最終行までが削除されたことがわかります。

[root@server ~]# sed '3,$d' test.txt
111
222

最終行を削除してみます。最終行が削除されたことがわかります。

[root@server ~]# sed '$d' test.txt
111
222
333
444

文字列333を含む行を削除してみます。

[root@server ~]# sed '/333/d' test.txt
111
222
444
555

次に、空行を削除するテストをするため、以下のテストファイルを作成します。2,4,6,8行目が空白行です。

[root@server ~]# cat test.txt
111

222

333

444

555

空行を削除してみます。空行は^$で表します。

[root@server ~]# sed '/^$/d' test.txt
111
222
333
444
555

4 行を挿入(i)、追加(a)する方法

テスト用ファイルを作成します。

[root@server ~]# vi test.txt
[root@server ~]# cat test.txt
111
222
333
444
555

4.1 行を挿入(i)する方法

新しい行を追加するには、iマンドまたはaコマンドを使用します。iコマンドは指定した行の前に行を挿入(insert)します。ここでは、1行目の前にxxxを挿入してみます。

[root@server ~]# sed '1ixxx' test.txt
xxx
111
222
333
444
555

4.2 行を追加(a)する方法

aコマンドは指定した行の後ろに行を追加(append)します。ここでは、最終行の後にxxxを追加してみます。

[root@server ~]# sed '$axxx' test.txt
111
222
333
444
555
xxx

5 文字列を置換(s)する方法

テスト用ファイルを作成します。

[root@server ~]# cat test.txt
111aaa111aaa
222aaa222bbb
333aaa333ccc

5.1 各行で最初に一致した文字列を変換する方法

各行で最初にaaaに一致した文字列をzzzに変換してみます。

[root@server ~]# sed 's/aaa/zzz/' test.txt
111zzz111aaa
222zzz222bbb
333zzz333ccc

5.2 各行で一致した文字列を全て変換する方法(g)

次に、各行でaaaに一致した全てをzzzに変換してみます。

[root@server ~]# sed 's/aaa/zzz/g' test.txt
111zzz111zzz
222zzz222bbb
333zzz333ccc

5.3 行頭を変更する方法

各行の行頭を文字列zzzに変更してみます。

[root@server ~]# sed 's/^/ZZZ/' test.txt
ZZZ111aaa111aaa
ZZZ222aaa222bbb
ZZZ333aaa333ccc

次に、2行目の行頭に文字列ZZZを追加してみます。2行目の行頭だけに文字列ZZZが追加されたことがわかります。

[root@server ~]# sed '2s/^/ZZZ/' test.txt
111aaa111aaa
ZZZ222aaa222bbb
333aaa333ccc

5.4 行末を変更する方法

各行の行末を文字列zzzに変更してみます。

[root@server ~]# sed 's/$/ZZZ/' test.txt
111aaa111aaaZZZ
222aaa222bbbZZZ
333aaa333cccZZZ

6 ファイルを上書きする方法(i)

”-i”は、標準出力の代わりに入力ファイルを上書きするオプションです。
テスト用のファイルを作成します。

[root@server ~]# cat test.txt
111
222
333

6.1 オプション指定なしの場合

[root@server ~]# sed 's/222/xxx/' test.txt
111
xxx
333

テスト用ファイルを確認します。ファイルが書き換えられていないことがわかります(期待値)。

[root@server ~]# cat test.txt
111
222
333

6.2 オプション指定ありの場合

[root@server ~]# sed -i 's/222/xxx/' test.txt

ファイルの2行目がxxxに置き換わったことがわかります。

[root@server ~]# cat test.txt
111
xxx
333

続けて、3行目のyyyに変換してみます。このとき、変換前のファイル(test.txt)をバックアップファイル(test.txt.bak)として保存してみます。

[root@server ~]# sed -i.bak 's/333/yyy/' test.txt

ファイルの3行目がyyyに置き換わったことがわかります。

[root@server ~]# cat test.txt
111
xxx
yyy

バックアップファイルは、変換前の内容であることがわかります。

[root@server ~]# cat test.txt.bak
111
xxx
333

7 複数のコマンドを1回で実行する方法(e)

"-eは、"複数のコマンドを1回で実行する場合のオプションです。ここでは、1回のsedコマンドの実行で、置換コマンド(s)を2回実行してみます。

テスト用のファイルを作成します。

[root@server ~]# cat test.txt
111aaa111aaa

111を999、aaaをzzzに変換してみます。

[root@server ~]# vi test.txt
[root@server ~]# sed -e 's/111/999/' -e 's/aaa/zzz/' test.txt
999zzz111aaa

次に、111だけを全て999に変換してみます。

[root@server ~]# sed -e 's/111/999/g' -e 's/aaa/zzz/' test.txt
999zzz999aaa

最後に、aaaも全てzzzに変換してみます。

[root@server ~]#  sed -e 's/111/999/g' -e 's/aaa/zzz/g' test.txt
999zzz999zzz

8 指定した行を表示する方法

テスト用のファイルを作成します。

[root@server ~]# cat test.txt
111
222
333
444
555

1行目を表示してみます。

[root@server ~]# sed -n '1p' test.txt
111

3行目から4行目を表示してみます。

[root@server ~]# sed -n '3,4p' test.txt
333
444

3行目から最終行までを表示してみます。

[root@server ~]# sed -n '3,$p' test.txt
333
444
555

最終行を表示してみます。

[root@server ~]# sed -n '$p' test.txt
555

3行目以外を表示してみます。

[root@server ~]# sed -n '3!p' test.txt
111
222
444
555

1行目から2行毎に表示してみます。

[root@server ~]# sed -n '1~2p' test.txt
111
333
555

9 行番号を表示する方法

テスト用ファイルを作成します。

[root@server ~]# cat test.txt
aaa
bbb
ccc
ddd
eee

cccに一致する行の行番号を表示してみます。

[root@server ~]# sed -n '/ccc/=' test.txt
3

eeeに一致する行の行番号を表示してみます。

[root@server ~]# sed -n '/eee/=' test.txt
5

10 その他

/var/log/messagesファイルの中から、特定の日時のログを抽出してみます。

[root@server ~]# sed -n '/Aug 29 21:08:19/,/Aug 30 18:51:39/p' /var/log/messages
Aug 29 21:08:19 server kernel: IPv6: MLD: clamping QRV from 1 to 2!
Aug 29 21:08:54 server systemd[1]: Starting dnf makecache...
Aug 29 21:08:55 server dnf[3174]: メタデータキャッシュは最近、リフレッシュされました。
Aug 29 21:08:55 server systemd[1]: dnf-makecache.service: Succeeded.
Aug 29 21:08:55 server systemd[1]: Started dnf makecache.
Aug 29 21:10:24 server kernel: IPv6: MLD: clamping QRV from 1 to 2!
Aug 30 18:51:39 server kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-240.el8.x86_64 root=UUID=d63ef999-ddcb-4ae0-a8b7-fb3df34a2595 ro crashkernel=auto resume=UUID=77dd497f-612f-4b7c-879c-1a1505369b67 rhgb quiet

次に、特定の/var/log/messagesファイルだけを表示してみます。/var/log/配下に、以下の5ファイルがあります。

[root@server ~]# ls -l /var/log/messages*
-rw-------. 1 root root  400287  8月 31 22:35 /var/log/messages
-rw-------. 1 root root 1061170  8月  9 11:11 /var/log/messages-20210809
-rw-------. 1 root root  586678  8月 15 20:14 /var/log/messages-20210815
-rw-------. 1 root root 1383042  8月 26 19:21 /var/log/messages-20210826
-rw-------. 1 root root  588203  8月 29 19:38 /var/log/messages-20210829

/var/log/配下の1番目と3番目の/var/log/messagesファイルを表示してみます。

[root@server ~]# ls -l /var/log/messages*|sed -n -e 1p -e 3p
-rw-------. 1 root root  400287  8月 31 22:35 /var/log/messages
-rw-------. 1 root root  586678  8月 15 20:14 /var/log/messages-20210815

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ