linux基礎(day27)

9.4 sed(上)

sed工具

  • sed -n '5'p test.txt
  • sed -n '1,5'p test.txt
  • sed -n '1,$'p test.txt
  • sed -n '/root/'p test.txt
  • sed -n '/^1/'p test.txt
  • sed -n 'in$'p test.txt
  • sed -n '/r..o/'p test.txt
  • sed -n 'oo*'p test.txt
  • sed -e '1'p -e '/111/'p -n test.txt

sed介紹

[root@localhost ~]# mkdir sed
[root@localhost ~]# cd sed
[root@localhost sed]# cp ../grep/passwd test.txt
[root@localhost sed]# pwd
/root/sed
[root@localhost sed]# ls
test.txt
[root@localhost sed]#
  • sed和grep相比較而言,sed也能實現grep的功能,但比較麻煩,也不會有顏色顯示
  • sed優點:在於替換,替換指定的字符

sed命令 實現grep匹配的功能

  • sed -n '/root/'p test.txt //匹配root關鍵詞,並打印出來
    • sed匹配的關鍵是 //
    • 若不加 -n 參數,則會把文件全部內容打印出來,並且,匹配出來的行連續打印兩次
    • 加 -n 參數後,則就只會顯示root所在的行
[root@localhost sed]# sed '/root/'p test.txt    //輸出文件全部內容, 並匹配出root的行連續打印兩次
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
等等等,只截取了一部分

在添加 -n參數後,則只會匹配出須要的兩行
[root@localhost sed]# sed -n '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]#

sed匹配的其餘用法

  • sed支持. * 還有特殊符號+
  • sed -n '/r.o/'p test.txt //匹配出包含r 和o 的字符
    • 其中的 . 表示匹配任意的一個字符,只能是一個字符
    • 這個點能夠是字符,英文字母,數字,特殊符號(包括 . )
[root@localhost sed]# sed -n '/r.o/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  • sed -n '/r*o/'p test.txt //表示匹配星號左邊的h字符,重複0到N次
    • 星號* ,表示* 前面須要有一個字符 表示0個或多個*前面的字符 跟後面有啥沒有關係
    • h* 能夠是啥都沒有啊(包括0個h)
    • h*n 只要有n就匹配
[root@localhost sed]# sed -n '/r*o/'p test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
等等等,只截取了一部分
  • sed -n '/r+o/'p test.txt //表示匹配一次或屢次 r 字符——>若不想使用脫義字符,則可使用 -r 參數,以下
  • 等於sed -nr '/r+o/'p test.txt
    • +加號,表示加號前面的字符,一次或屢次
    • 對比 * 號,區別是號是0次或屢次
[root@localhost sed]# sed -nr '/r+o/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]#
  • sed -nr '/o{2}/'p test.txt //匹配連續兩次出現 o 的行
[root@hf-01 sed]# sed -nr '/o{2}/'p test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@hf-01 sed]#
  • sed -n '/^h/'p test.txt //匹配以h字符開頭的行
[root@hf-01 sed]# sed -n '/^h/'p test.txt    //匹配以h字符開頭的行
halt:x:7:0:halt:/r.o:/sbin/halt
hhhhhao
  • sed -nr '/root|nologin/'p test.txt //匹配出現root或nologin的行
[root@hf-01 sed]# sed -nr '/root|nologin/'p test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
等等等,只截取了一部分

sed命令打印指定的行

  • sed -n '2'p test.txt //打印文件中指定的第二行
[root@hf-01 sed]# sed -n '2'p test.txt    //打印指定的第二行
bin:x:1:1:bin:/bin:/sbin/nologin
[root@hf-01 sed]#
  • sed -n '2,5'p test.txt //打印文件中的第二行到第五行
[root@hf-01 sed]# sed -n '2,5'p test.txt    //打印文件中的2到5行
bin:x:1:1:bin:/bin:/sbin/nologin
adas:124:bdsf:rto:pass
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dfdf:rggo:124
[root@hf-01 sed]#
  • sed -n '24,$'p test.txt //打印24行到最後一行的文件
    • $ 表示末行,最後一行
[root@hf-01 sed]# sed -n '24,$'p test.txt
asfhan
dannnnnn
hhhhhao
[root@hf-01 sed]#
  • sed -n '1,$'p test.txt //打印文件中全部的行
[root@hf-01 sed]# sed -n '1,$'p test.txt    //打印從第一行到結束的行
  • sed -n '/in$/'p test.txt //匹配以in結尾的行
[root@localhost sed]# sed -n '/in$/'p test.txt    //匹配以in結尾的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
等等等,只截取了一部分

sed命令 -e 表達式

  • sed -e '1'p -e '/111/'p -n test.txt //表示在兩個表達式中,先文件中匹配第一段字符,而後在匹配bus的字符段
    • -e 表示在同一個表達式裏面作多個動做
    • 在-e的兩個表達式中重合,就會打印兩次(看例子)——>能夠寫多個表達式
      • sed -e '1'p -e '/111/'p -e '/root/'p -n test.txt
[root@hf-01 sed]# sed -e '1'p -e '/bus/'p -n test.txt    //表示在一個表達式中,先文件中匹配第一段字符,而後在匹配bus的字符段
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin

在兩個-e的表達式中是重合的,則會打印兩次
[root@hf-01 sed]# sed -e '1'p -e '/root/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@hf-01 sed]#
  • sed -e '1'p -e '/111/'p -e '/root/'p -n test.txt //在表達式中屢次匹配,並打印出來(重合的會繼續打印)
[root@hf-01 sed]# sed -e '1'p -e '/root/'p -e '/root/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@hf-01 sed]#

sed命令匹配不區分大小寫 I

  • sed -n '/bus/'Ip test.txt //匹配文件中bus字符,不區分大小寫

9.5sed(下)

sed工具

  • sed '1'd test.txt
  • sed '1,3'd test.txt
  • sed '/oot/'d test.txt
  • sed '1,2s/ot/to/g' test.txt
  • sed 's#ot#to#g' test.txt
  • sed 's/[0-9]//g' test.txt
  • sed 's/[a-zA-Z]//g' test.txt
  • sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt
  • sed 's/^.*$/123&/' test.txt
  • sed -i 's/ot/to/g' test.txt

sed命令刪除指定的行

  • sed '1,20'd test.txt //刪除指定的行(但實質並未刪除,只是將剩餘的行列出來——>使用wc -l命令可查看原有的行並未刪除)
[root@hf-01 sed]# sed '1,20'd test.txt
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/bin/bash
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
asfhan
dannnnnn
hhhhhao
[root@hf-01 sed]# wc -l test.txt
26 test.txt
  • sed -i '1,20'd test.txt //刪除指定的行(在加了-i參數後,會把文件內容刪除)
[root@hf-01 sed]# cp test.txt test.txt.bak
[root@hf-01 sed]# sed -i '1,20'd test.txt
[root@hf-01 sed]# wc -l test.txt
6 test.txt
[root@hf-01 sed]#
  • 總結,sed刪除指定的行
  • 在直接 sed '1,20'd test.txt 僅僅是剩餘的行列出到屏幕上,而其餘的行不列,並未刪除文件
  • 而在加了 -i 參數後,sed -i '1,20'd test.txt 會把文件內容刪除更改

sed命令 指定內容刪除

  • sed -i '/sshd/'d test.txt //加了-i 參數後,會直接修改文件內容
[root@hf-01 sed]# sed -i '/sshd/'d test.txt    //會直接修改文件內容,刪除sshd這一行
[root@hf-01 sed]# cat test.txt
mysql:x:1000:1000::/home/mysql:/bin/bash
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
asfhan
dannnnnn
hhhhhao
[root@hf-01 sed]#

sed命令 查找替換 功能

  • sed 命令的查找替換和vim的查找替換類似
  • sed '1,5s/nologin/lala/g' test.txt //在1到5行中,把nologin替換成lala
    • 會把這個文件中全部內容都打印出來
    • g表示全局替換
[root@hf-01 sed]# sed '1,5s/nologin/lala/g' test.txt    //把文件中1到5行中的nologin替換成lala
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/lala
adas:124:bdsf:rto:pass
daemon:x:2:2:daemon:/sbin:/sbin/lala
dfdf:rggo:124
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
等等等,只截取了一部分
[root@hf-01 sed]#
  • 正則表達式中查找替換
  • sed -r '1,5s/ro+/r/g' test.txt //將文件的1到5行中的ro+替換成r
    • 由於有特殊符號,因此得使用 -r 參數
    • (在使用cat test.txt的時候,會發現並無真實替換,只是打印出在屏幕上替換了)
[root@hf-01 sed]# sed -r '1,5s/ro+/r/g' test.txt    //將文件的1到5行中的ro+替換成r
rt:x:0:0:rt:/rt:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adas:124:bdsf:rto:pass
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dfdf:rggo:124
等等等,只截取了一部分
  • sed查找替換總結:
  • 若裏面有特殊符號,則須要脫義 - 只能先使用-ri參數,而不能-ir參數(-r參數脫義特殊符號,-r參數直接修改文件內容) - 或者在特殊符號前面使用 \

sed命令 第一段和最後一段替換位置

  • head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' 把文件的前10行的第一段和最後一段進行替換位置
    • head 默認查看前10行
    • s 前不指定範圍,就表示所有
    • .* 表示貪婪匹配
[root@localhost sed]# head test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
對比
[root@localhost sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:11:0:operator:/root:operator
[root@localhost sed]#
  • 需求:把第一段和最後一段替換位置,由於內容是用 : 冒號分割的,因此可使用 : 冒號做爲分割對象
    • 前面用小括號括的內容,後面的就要用反斜槓 \ 加數字 去表示它

sed命令 將/root 替換成123 須要脫義

  • head tset.txt |sed 's//root/123/g' //在文件前5行,把/root 替換成 123
[root@localhost sed]# head test.txt |sed 's/\/root/123/g'
root:x:0:0:root:123:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost sed]#
  • 若替換的內容中有多個/ ,好比/sbin/nologin 替換成123
    • 則須要使用脫義符號 \ ,或者使用@
  • head test.txt |sed 's//sbin/nologin/123/g' //替換/sbin/nologin內容中有多個 /
[root@localhost sed]# head -n5 test.txt |sed 's/\/sbin\/nologin/123/g'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
[root@localhost sed]#
  • 也能夠替換分隔符使用 @ 或者 # 替代——>只要能夠去區分開就能夠
[root@localhost sed]# head - n5 test.txt |sed 's@/sbin/nologin@123@g'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123

[root@localhost sed]# head test.txt |sed 's#/sbin/nologin#123#g'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
[root@localhost sed]#

sed命令 刪除文件中全部英文字母 's/[a-zA-Z]//g'

  • head -n5 test.txt |sed 's/[a-zA-Z]//g' //刪除前5行中全部的英文字母
    • 只須要替換成 空 便可,就會刪除全部的英文字母
[root@localhost sed]# head -n5 test.txt |sed 's/[a-zA-Z]//g'    //刪除前5行中全部的英文字母
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
[root@localhost sed]#

sed命令在 全部行前面加上字符串

  • head -n5 test.txt |sed -r 's/(.*)/aaa:&/' //在前5行中,全部行前面添加aaa字符
    • (.*) 表示一整行
    • &符號就表示前面的小括號
[root@localhost sed]# head -n5 test.txt |sed -r 's/(.*)/aaa:&/'    //在前5行中,全部行前面添加aaa字符
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost sed]#
相關文章
相關標籤/搜索