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$