- 1 はじめに
- 2 検証環境
- 3 行を削除(d)する方法
- 4 行を挿入(i)、追加(a)する方法
- 5 文字列を置換(s)する方法
- 6 ファイルを上書きする方法(i)
- 7 複数のコマンドを1回で実行する方法(e)
- 8 指定した行を表示する方法
- 9 行番号を表示する方法
- 10 その他
- Z 参考情報
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技術ブログ