linux文本處理工具
- 1.grep
-
- 1.字元的過濾grep
- 2.grep的基礎搜尋文本指令
- 3.grep指令字元數量比對規則
- 2.sed 字元替換
-
- p 顯示
- d 删除
- a 添加
- c 替換
- w 寫入(将符合條件的行寫入指定檔案中)
- i 插入
- r 整合(整合檔案内容到指定行)
- s 替換關鍵字
- 3.awk
-
- awkd的用法
- 練習:
1.grep
1.字元的過濾grep
grep指令是linux下的文本處理工具,這些指令都是用于對一個檔案和文本執行重複搜尋的工具。我們可以通過grep指令指定特定的搜尋條件來搜尋檔案及其内容以擷取有用的資訊。 grep時全局搜尋,其抓取資料是貪婪模式,即不會漏掉過濾内容,但準确性也會降低
2.grep的基礎搜尋文本指令
egrep = grep -E
grep -e ”root|nologin“ passwd 搜尋含有root和nllogin的行 = grep -e root -e nologin passwd (同時過濾兩個目标)
grep -i root passwd 忽略大小寫
grep -E “<root” passwd 搜尋字元不能有字首
grep -E “root>” passwd 搜尋字元不能有字尾
grep -E “<root>” passwd 搜尋字元前後都不能有字尾
grep -n westos passwd 顯示比對的行所在行号
grep -5 westos passwd 顯示過濾行及前後5行将會顯示
grep -B5 westos passwd 顯示含有關鍵字的行及以上5行
grep -A5 westos passwd 顯示含有關鍵字的行及以下5行
grep -v root passwd 顯示不含有root的過濾行(反選)
3.grep指令字元數量比對規則
grep ^westos westos 以westos開頭
grep westos$ westos 以westos結尾
grep w.s westos ws之間有任意一個字元的
grep w…s westos ws之間有任意三個字元的
grep -E “w.*s“ westos 表示字元出現了任意次
grep -E "was" westos a出現了任意次
grep -E “wa{2}s” westos a出現了兩次
grep -E “wa?s” westos a出現了0-1次
grep -E ‘w.+s’ westos 含有任意字元出現一次以上
grep -E ‘w.{3,}s’ westos 含有最少三個任意字元
grep -E ‘w.{,3}s’ westos 最多三個
grep -E ‘w.{1,3}s’ westos 1-3個
grep -E ‘w(ab){3,}s’ westos 含有字元串最少3個的所在行
練習:
使用腳本把主機中可以su切換的使用者過濾出來
#!/bin/bash
grep -E "bash$|sh$" /etc/passwd | cut -d : -f 1
2.sed 字元替換
不輸出模式空間的内容,隻輸出處理過的内容
p 顯示
sed -n 5p passwd 顯示第五行内容
cat -b passwd | sed -n 3,5p 顯示3-5行
cat -b passwd | sed -n ‘3p;5p’ 顯示3行和5行 (-b 顯示輸出行号)
cat -b passwd | sed -n ‘/^root/p’ 顯示root開頭的行
sed -n ‘bash / p ′ p a s s w d 顯 示 以 b a s h 結 尾 的 行 s e d − n ′ 5 , /p' passwd 顯示以bash結尾的行 sed -n '5, /p′passwd顯示以bash結尾的行sed−n′5,p’ passwd 顯示第5行到最後一行
sed -n ‘$p’ passwd 顯示最後一行
d 删除
cat -b passwd | sed ‘5,8d’ 删除5-8行
cat -b passwd | sed -e ‘5d;8d’ 删除5和8行
sed -e ‘/^root/d’ passwd 删除以root開頭的行
sed -e ‘/bash$/d’ passwd 删除bash結尾的行
a 添加
sed ‘2aleeleelee’ westos 在第2行之後添加leeleelee
sed ‘hello/aleeleelee’ westos 在hello後加leeleelee
sed ‘$aleeleelee’ westos 在最後一行後面加leeleelee
c 替換
sed ‘1chahaha’ westos 第一行替換為hahaha
sed ‘/linux/chahaha’ westos 将linux替換為hahaha
w 寫入(将符合條件的行寫入指定檔案中)
sed ‘/nologin$/wwestosfile’ passwd 将passwd中以nologin結尾的行全部寫入到westosfile中
i 插入
r 整合(整合檔案内容到指定行)
sed ‘2rlee’ westos 将lee整合到westos中的第二行之後
sed ‘hello/rlee’ westos 将lee檔案内容整合到westos中hello行之後
s 替換關鍵字
(g表示所有關鍵字的列,如果不加g則預設替換每行出現的第一列)
sed ‘s/a/b/g’ test 将test中的a全部替換成b
sed ‘s/sbin/westos/g’ passwd 将sbin替換為westos
sed ‘4,5s/sbin/westos/g’ passwd 4-5行的sbin替換成westos
sed ‘$s/sbin/westos/g’ passwd 最後一行
sed ‘s///###/g’ passwd 将全文的/替換為#,\是轉譯/不是指令而是單純的字元 或者可以将/寫成@ 即 sed ‘s@/@###@g’ passwd
儲存:
sed ‘s@/@###@g’ -i passwd 将sed處理的内容儲存在原檔案中
練習:
編寫一個腳本,使得其可以輸入一個端口,http的端口就改為這個數字
思路:
1.先確定運作腳本時輸入了數字,不能為空
2.确認主機下載下傳了該服務
3.确認服務已經啟動
4.改變http配置檔案的端口,并重新開機
5.顯示http服務改變後的端口
#!/bin/bash
setenforce 0 &> /dev/null
[ -z "$1" ] && {
echo "Errow:Please input port following script !!"
exit
}
rpm -q httpd &> /dev/null || {
echo "Errow:Apache is not installed !!"
exit
}
systemctl status httpd | grep "running" &> /dev/null || {
echo "Eroow:Apache is not running !!"
exit
}
netstat -antlupe | grep -E ":$1\>" &> /dev/null && {
echo "Errow: $1 is in used !! "
exit
}
sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd
netstat -antlupe | grep http
3.awk
awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對資料分析并生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符将每行切片,切開的部分再進行各種分析處理。
$0 表示顯示所有列
$1 隻顯示第一列
$2 隻顯示第二列
awkd的用法
(1) 使用awk指令,首先輸出顯示westos,接着-F指定以:為分隔符截取顯示passwd檔案的第一列,最後輸出顯示end
#BEGIN:運作處理政策之前的動作 print $1: 處理動作 END:處理結束所作事情
注意: ‘ ’引起來的截取政策中的字元串需要用“ ”引起來,否則awk指令會将其當作變量處理(即不會輸出顯示指定字元串本身)
awk -F : BEGIN’{print “name”}{print $1}END{print “end”}’ westos

(2)使用awk指令統計passwd檔案行數:給變量N賦初值為0,awk每讀取一行檔案内容變量N就進行一次自加操作,最後輸出變量N的值即為passwd檔案的行數
awk -F : ‘BEGIN{westos=0}{westos++}END{print westos}’ westos
(3)
awk -F : ‘{print NF}’ westos NF表示統計列數
awk -F : ‘{print NR}’ westos NR表示統計行數
awk -F : ‘/nologin$/{print $1,$7}’ westos 顯示以nologin結尾的行
awk -F : ‘/nologin$|^root/{print $1,$7}’ westos 條件中兩個元素是或的關系,以nologin結尾或root開頭
awk -F : ‘/bash$/&&/^root/{print $1,$7}’ westos 兩個條件是且的關系,同時符合bash結尾以root開頭
awk -F : '$7~/bash$/{print $0}' westos
#顯示第7列是以bash結尾的結果(結果顯示所有列)
awk -F : '$7!~/bash$/{print $0}' westos
#第7列不是以bash結尾的
awk -F : '{print FILENAME}' westos #FILENAME:要處理的檔案名稱
練習:
用awk指令找出主機中可以登陸且家目錄不在/home下的使用者數量
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd
用awk指令一次抓取出ifconfig中的ip