初識shell文本處理工具之gawk-sed

shell

gawk

gawk選項

  • -F 指定行中分隔數據字段的字段分隔符
  • -f 指定處理程序的腳本名
  • -v var=value 定義gawk程序中的變量
  • -mf N 指定處理數據文件中的最大行數
  • -mr N 指定數據文件的最大數據行數

gawk數據字段變量

  • $0 表示整個文本行
  • $1 表示整個文本行中第一個數據字段
  • $2 表示整個文本行中第二個數據字段

一個簡單的案例

# BEGIN這是處理數據之前運行的腳本
BEGIN {
# 這是定義的變量,在以下其他階段的腳本中也可以調用,變量的調用方式如同shell中調用變量,但是不加$符號
separator1="           "

FS=":"
print "用戶名"separator1"密碼"separator1"用戶ID"separator1"組ID"separator1"用戶全名"separator1"主目錄"separator1"登錄shell"separator1}

# 這是進行數據處理的腳本
{ 
print $1 separator1 $2 separator1 $3 separator1 $4 separator1 $5 separator1 $6 separator1 $7 separator1
}
# END這是數據處理最後要運行的腳本
END {
print "==========================THE END======================="
}

指定方式爲:

root@node1:~# gawk -f ./passwd.awk /etc/passwd

sed

替換標記

  • g: 全局替換
  • p: 打印替換後的行
  • 數字 表明新文本將替換地擠出模式匹配的地方
  • w: 將替換的結果寫入到文件中

替換字符

爲了防止與某些特定的字符相沖突,sed支持選擇其他的字符進行分隔

sed 's!/bin/bash!/bin/csh' /etc/passwd

行尋址

  • 行的數字範圍
  • 用文本模式來過濾出某行

行尋址的使用格式

[address]command

也可以把特定地址的多個命令放在一起

address{
    command1
    command2
    command3
}

數字方式尋址

sed '2s/dog/cat/' data1'
sed '2,21s/dog/cat/' data1'
sed '2,$s/dog/cat/' data1'

文本模式尋址

sed '/admin/s/dog/cat' data2

組合命令

root@node1:~# sed -n '2{s/daemon/admin/g;s/nologin/login/p}' /etc/passwd
admin:x:1:1:admin:/usr/sbin:/usr/sbin/login

刪除行

sed 'd' data2 #刪除data2中的所有記錄
sed '3d' data2 #刪除data2中第三行
sed '4,$d' data2 #刪除data2中第四行到最後的數據
sed '/line   1/d' data2 #刪除模式匹配到的行
sed '/1/,/2/d' data2 #匹配到第一個打開行刪除功能,匹配到第二個執行行刪除功能,並刪除兩個匹配到的行,如果第二個模式沒有被匹配到,那麼整個文件的數據都被刪掉了

插入和附加文本

  • insert i 在指定行前插入一個新行
  • append a 在指定行後插入一個新行
root@node1:~# echo "line" | sed 'i\linedemo'
linedemo
line
root@node1:~# echo "line" | sed 'a\linedemo'
line
linedemo

但是在數據流中需要指定要插入或者要追加的位置

root@node1:~# cat date2 
line1
line2
line3
root@node1:~# sed '1i\demo' date2 
demo
line1
line2
line3
root@node1:~# sed '2a\demo' date2 
line1
line2
demo
line3
# sed '1i\first line' date2 # 總是插入在第一行
# sed '$a\end line' date2 # 總是追加在最後一行

修改行

root@node1:~# sed '3c\the change line' date2 
line1
line2
the change line
root@node1:~# sed '1,$c\the change line' date2 
the change line
root@node1:~# sed '1,2c\the change line' date2 
the change line
line3
root@node1:~# sed '/line1/c\the change line' date2 
the change line
line2
line3

轉換命令

# 前面的數字與後面的字母一對一的進行轉換,1映射到a
root@node1:~# sed 'y/123/abc/' date2 
linea
lineb
linec
root@node1:~# sed '1,2y/123/abc/' date2 
linea
lineb
line3

回顧打印

  • 小寫p 用來打印文本行
  • 等號= 用來打印行號
  • 小寫l 用來列出行

打印文本行

root@node1:~# head -3 /etc/passwd | sed 'p'
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
root@node1:~# head -3 /etc/passwd | sed -n 'p'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

打印行號

root@node1:~# head -3 /etc/passwd | sed -n '='
1
2
3
root@node1:~# head -3 /etc/passwd | sed '='
1
root:x:0:0:root:/root:/bin/bash
2
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3
bin:x:2:2:bin:/bin:/usr/sbin/nologin

列出行

# 注意每行最後的一個$字符
root@node1:~# head -3 /etc/passwd | sed -n 'l'
root:x:0:0:root:/root:/bin/bash$
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin$
bin:x:2:2:bin:/bin:/usr/sbin/nologin$
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章