linux之sed

被时光移动的城市發表於2024-11-17

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.

相關文章