sed
- 引數
- 取行
grep 引數
grep 引數選項
-v # 取反
-r # 遞迴過濾檔案內容 從目錄中遞迴查詢
-w # 過濾的內容兩邊必須是空格
-E # 支援擴充套件正則 egrep
-i # 不區分大小寫
-n # 過濾到內容行號
-c # 統計單詞出現的次數
-o # 匹配過程
-A # 過濾到內容往下2行
-B # 過濾到內容往上2行
-C # 過濾到內容上下各2行
sed
- 1.取行
- 2.刪除行
- 3.替換行
- 4.增加內容
- 5.後向引用
sed 引數
語法結構:
sed '模式+動作' file # 直接處理檔案 效率比較高
cat file|sed '模式+動作' # 效率較低
其他命令的結果|sed 對顯示到螢幕上的內容進行處理
模式: 找誰,按照行 模糊過濾查詢檔案內容
動作: 找到後幹啥 顯示 刪除 替換 增加內容
語法格式:
sed -n 'np' file # n為數字 p為print輸出結果
引數選項:
-n # 取消預設輸出
-r # 支援擴充套件正則
-i # 修改原始檔
sed取行
# 列印第三行身份證號
[root@m01 ~]# sed -n '3p' id.txt
趙 37142518322922103X
# 列印最後一行
[root@m01 ~]# sed -n '$p' id.txt
趙 37142518322922103X
# 列印檔案中第3-5行
[root@m01 ~]# sed -n '3,5p' id.txt
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
# 列印檔案第6行到尾部
[root@m01 ~]# sed -n '6,$p' id.txt
夏 222113859123487192
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
# 列印第二行 ,第五行號
[root@m01 ~]# sed -n '2p;5p' id.txt
夏 222113859123487192
趙 37142518322922103X
# 列印文字 帶上行號
[root@m01 ~]# cat id.txt |grep -n .
1:孔 150000123874591242
2:夏 222113859123487192
3:趙 37142518322922103X
4:夏 222113859123487192
5:趙 37142518322922103X
6:夏 222113859123487192
7:趙 37142518322922103X
8:夏 222113859123487192
9:趙 37142518322922103X
10:趙 37142518322922103X
11:夏 222113859123487192
12:趙 37142518322922103X
sed模糊過濾查詢內容
語法格式:
grep 'root' passwd
sed -n '/root/p' passwd # 模糊過濾查詢包含root的行
sed -n '//,//p' passwd # 過濾區間範圍的字串 經常用來過濾日誌中時間範圍
匹配行
# sed -n '/root/p' == grep 'root'
[root@m01 ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@m01 ~]#
# sed -n '//,//p' 取一段時間內的日誌
sed -n '/14:05:27/,/16:12:57/p' /var/log/nginx/access.log
# 檢視以r開頭的行
[root@m01 ~]# sed -n '/^r/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 檢視以h結尾的行
[root@m01 ~]# sed -n '/h$/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
usera:x:1000:1000::/home/usera:/bin/bash
# 檢視 以r開頭 或者 以h結尾的行
# sed -r引數擴充套件正則
[root@m01 ~]# sed -nr '/^r|h$/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
usera:x:1000:1000::/home/usera:/bin/bash
# 檢視以a 或者 r開頭的行號
[root@m01 ~]# sed -nr '/^[ar]/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
[root@m01 ~]# sed -n '/nobody/,/ntp/p' /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
sed刪除
預設臨時的輸出到螢幕上不修改原始檔
想要修改原始檔需要加-i引數
語法結構:
sed '3d' # 指定刪除第3行
sed '3,5d' # 區間範圍刪除
sed '/root/d' # 刪除包含root的行
sed '/n$/d' # 使用正規表示式
刪除
[root@m01 ~]# cat id.txt
孔 150000123874591242
夏 222113859123487192
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
# 刪除第3行號
[root@m01 ~]# cat id.txt |sed '3d'
孔 150000123874591242
夏 222113859123487192
夏 222113859123487192
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
# 刪除3-5行
[root@m01 ~]# cat id.txt |sed '3,5d'
孔 150000123874591242
夏 222113859123487192
夏 222113859123487192
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
# 刪除包含X的行
[root@m01 ~]# cat id.txt |sed '/X/d'
孔 150000123874591242
夏 222113859123487192
夏 222113859123487192
夏 222113859123487192
夏 222113859123487192
夏 222113859123487192
# 刪除以2結尾的行號
[root@m01 ~]# cat id.txt |sed '/2$/d'
趙 37142518322922103X
趙 37142518322922103X
趙 37142518322922103X
趙 37142518322922103X
趙 37142518322922103X
趙 37142518322922103X
# 刪除包含 1 2 9 7 0 的行
[root@m01 ~]# sed -r '/1|2|9|7|0/d' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
sed之增加替換內容
sed之增加替換內容
sed '3a' # 在第3行追加內容
sed '3i' # 在第3行插入內容
sed '3c' # 將第3行完全替換
sed '3w w.txt' # 將第3行儲存到新檔案中
# 在第3行後插入
[root@m01 ~]# sed '3a hello' id.txt
孔 150000123874591242
夏 222113859123487192
趙 37142518322922103X
hello
# 在第3行前插入
[root@m01 ~]# sed '3i hello' id.txt
孔 150000123874591242
夏 222113859123487192
hello
# 將第3行替換
[root@m01 ~]# sed '3c hello' id.txt
孔 150000123874591242
夏 222113859123487192
hello
# 將第17行進行替換
# sed '17c Port 22' /etc/ssh/sshd_config
# 將第3行寫入到新的檔案中
[root@m01 ~]# sed '3w w.txt' id.txt
[root@m01 ~]# ls
1.txt 2.txt anaconda-ks.cfg doc dr id.txt w.txt
[root@m01 ~]#
# 將3-5行寫入到w.txt中
[root@m01 ~]# sed '3,5w w.txt' id.txt
[root@m01 ~]# cat w.txt
趙 37142518322922103X
夏 222113859123487192
趙 37142518322922103X
sed 替換
語法格式:
sed 's#替換誰#替換成誰#g' file
sed 's///g' file
sed 's@@@g' file
sed 'sAAAg' file
# 將root 替換成ROOT
[root@m01 ~]# cat /etc/passwd |sed 's#root#ROOT#g'
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
# 替換每行出現的第一個單詞
cat /etc/passwd |sed 's#u#HELLO#'
# 替換檔案中的: 為-
[root@m01 ~]# cat /etc/passwd |sed 's#:#-#g'
root-x-0-0-root-/root-/bin/bash
bin-x-1-1-bin-/bin-/sbin/nologin
# 將【:/】 替換成 -
[root@m01 ~]# cat /etc/passwd |sed -r 's#:|/#-#g'
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
== 等同於
[root@m01 ~]# cat /etc/passwd |sed 's#[:/]#-#g'
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
# 刪除檔案中的a-z
[root@m01 ~]# cat /etc/passwd |sed 's#[a-z]##g'
::0:0::/://
::1:1::/://
::2:2::/://
# 刪除a-z之外的所有內容
[root@m01 ~]# cat /etc/passwd |sed 's#[^a-z]##g'
rootxrootrootbinbash
binxbinbinsbinnologin
# 按照字母排序統計
[root@m01 ~]# cat /etc/passwd |sed 's#[^a-z]##g' |grep . -o |sort |uniq -c |sort -rn |head
86 n
78 o
66 s
58 i
41 b
39 t
38 a
36 l
35 e
31 r
# 按照單詞排序統計
[root@m01 ~]# cat /etc/passwd |sed 's#[:x0-9/-]# #g' |xargs -n1 |sort |uniq -c |sort -rn |head
24 sbin
18 nologin
7 var
6 bin
4 root
3 sync
3 spool
3 shutdown
3 mail
3 halt
sed模式+動作進行替換
- 查詢就等於模式 查詢後的動作是輸出p
# 將第4行的nologin替換為NOGLOGIN
[root@m01 ~]# cat /etc/passwd |sed '4s#nologin#NOGLOGIN#g'
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/NOGLOGIN
# 將第1行-3行的x替換成A
[root@m01 ~]# cat /etc/passwd |sed '1,3s#x#A#g'
root:A:0:0:root:/root:/bin/bash
bin:A:1:1:bin:/bin:/sbin/nologin
daemon:A:2:2:daemon:/sbin:/sbin/nologin
# 查詢到包含root的行將x替換成X
[root@m01 ~]# cat /etc/passwd |sed '/root/s#x#X#g'
root:X:0:0:root:/root:/bin/bash
# 檔案中test 替換成TEST 修改到檔案 加-i引數
sed 's#test#TEST#g' -i /etc/passwd
# 將3-5行進行註釋
[root@m01 ~]# cat /etc/passwd |sed '3,5s#^#\##g'
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
# 指定註釋某行 查詢root開頭並註釋該行
[root@m01 ~]# cat /etc/passwd |sed '/root/s#^#\##g'
#root:x:0:0:root:/root:/bin/bash
vim批次註釋
ctrl+v 進入可視塊模式
然後鍵盤上下鍵選擇
選擇後按大寫的I 進入編輯模式
然後輸入內容
完成後按兩次ESC鍵即可
可視模式
按d 為刪除
vim中替換動作
:s/root/ROOT/g # 只替換游標所在行的所有root
:%s/root/ROOT/g # 將檔案中所有的root替換成ROOT
sed後向引用
語法結構:
sed 's#(正則)#\1#g' # \1獲取第一個括號中的內容 \2獲取第2個括號中的內容
# 將想要的內容輸出
[root@m01 ~]# echo helloworld |sed -r 's#(hello)world#\1#g'
hello
[root@m01 ~]# echo helloworld |sed -r 's#(hello)(world)#\1\2#g'
helloworld
[root@m01 ~]# echo helloworld |sed -r 's#(.*)(world)#\1#g'
hello
[root@m01 ~]# echo helloworld |sed -r 's#(h.*o)(rld)#\1#g'
hellowo
[root@m01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
# 獲取ip地址
[root@m01 ~]# ip a |sed -n '3p' |sed -r 's#(.*inet )(.*)(/)(.*)#\2#g'
127.0.0.1
# 批次新增使用者
[root@m01 ~]# echo user{1..3} |xargs -n1 |sed -r 's#(.*)#useradd \1#g' |bash
useradd user1
useradd user2
useradd user3
# 批次修改密碼
[root@m01 ~]# echo user{a..c} |xargs -n1 |sed -r 's#(.*)#useradd \1; echo 123456 |passwd --stdin \1#g' |bash
Changing password for user usera.
passwd: all authentication tokens updated successfully.
Changing password for user userb.
passwd: all authentication tokens updated successfully.
Changing password for user userc.
passwd: all authentication tokens updated successfully.