一、grep:文本搜索工具
-c 只輸出匹配的行數
-i 不區分大小寫
-v 過濾掉包含指定字符串的行
-s 不顯示不存在或無匹配的文本的錯誤信息
-w 只顯示匹配的整個單詞,而不是字符串的一部分
-n 顯示匹配行及行號
-l 只列出匹配的文件名
-L 列出不匹配的文件名
例:
grep -c root /etc/passwd 如果包含root字符串在文件中有兩行,顯示爲2
grep -i root /etc/passwd 顯示出root字符串的行,包含其大小寫
grep -v root /etc/passwd 顯示除含有root字符串的行
grep ‘test’ d* 顯示所有以d開頭的文件中包含test字符串的行
grep '^$' /etc/passwd 顯示passwd文件中的空行
grep 'test' aa bb cc 顯示在aa,bb,cc文件中匹配test的行
正則表達式的主要參數:
\ 忽略正則表達式中特殊字符的原有含義
[] 單個字符,如[a]即[a]符合要求
[-] 範圍,如[a-z],即a,b,c一直到z都符合要求
grep '[a-z]\{5\}' aa 顯示所有包含每個字符串至少有5個連續小寫字符的字符串的行,a-z都可以
grep 'w\(es\)t.*\1' aa 如果west被匹配,則es被存儲到內存中,並標記爲1,然後搜索任意個字符(.*), 這些字符後面緊跟着另外一個es(\1),找到就顯示該行。例:west.es west.esdd.es west.aa.es
grep test /mnt/* 目錄下搜索帶字符串test的文件
grep -l test /mnt/* 只列出匹配的文件名
grep -L test /mnt/* 列出不匹配的文件名
[[:alpha:]] 單個字母
[[:lower:]] 單個小寫字母
[[:upper:]] 單個大寫字母
[[:alnum:]] 單個字母或數字
[[:punct:]] 單個符號,不包含數字,字母以及空格
[[:digit:]] 數字
[[:space:]] 空格
例:grep '5[[:upper:]][[:upper:]]' aa 顯示以5開頭以兩個大寫字母結尾的行
二、sed:文本處理工具
-u 展示修改後的文本內容,但不是真的改
-i 直接修改文件,不顯示內容
sed '1d' file 刪除第一行
sed '2,$d' file 刪除第二行到最後一行
sed '1a play lol' file 第一行後面增加字符串"play lol"
sed '5i go die' file 在第5行前添加"go die"
sed '1c Hi' file 第一行代替爲Hi
sed -n 2,'$'p file 顯示第二行到最後一行
sed 's/^.*asd.*$/lizekang/g' file 匹配asd字符,並修改整行爲lizekang
sed '14c [file]' file 修改14行整行爲[file]
sed -n '/^\//p' file 顯示以/開頭的行(如果沒有-n選項,則顯示file中的所有內容和/開頭的行兩份,-n模式將其他行過濾掉,只顯示/開頭的行)
sed '/^$/d' fiel 刪除文件中的空白行
sed '/^#/d' file 刪除文件開頭的#號
sed 's/^[[:spqce:]]*//g' fiel 刪除文件行首的空格
三、awk:文本分析工具
-F(分割詞):不添加此參數默認以空格分割。
'{print $1}' :必要字段,輸出具體第幾段,$NF表示最後一個元素。
awk '{print NR,$0}' 在每行前面加上行號。
awk '{if (NR<=3+1 && NR>=2) print $0}' 輸出第二行到第四行。
netstat -an|awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}'
/^tcp/ 濾出tcp開頭的記錄,屏蔽udp,socket等無關記錄。
state[] 相當於定義一個叫state的數組
NF 表示記錄的字段數
state[$NF] 表示數組元素的值,如上就是state[TIME_WAIT]的連接數
++state[$NF] 上面的連接數加1
下面是awk的一些練習:
1. 用awk 打印整個test.txt (以下操作都是用awk工具實現,針對test.txt);
awk '{print $0}' test.txt
2. 查找所有包含’bash’的行;
awk '/bash/' test.txt
3. 用’:’作爲分隔符,查找第三段等於0的行;
awk -F ':' '$3=="0"' test.txt
4. 用’:’作爲分隔符,查找第一段爲’root’的行,並把該段的’root’換成’toor’(可以連同sed一起使用);
awk -F ':' '$1=="root"' test.txt | sed 's/root/root/g'
5. 用’:’作爲分隔符,打印最後一段;
awk -F ':' '{print $NF}' text.txt
6. 打印行數大於20的所有行;
awk -F ':' 'NR>20' test.txt
7. 用’:’作爲分隔符,打印所有第三段小於第四段的行;
awk -F ':' '$3<$4' test.txt
8. 用’:’作爲分隔符,打印第一段以及最後一段,並且中間用’@’連接 (例如,第一行應該是這樣的形式 “root@/bin/bash”;
awk -F ':' '{print $1"@"$NF}' test.txt
9. 用’:’作爲分隔符,把整個文檔的第四段相加,求和;
awk -F ':' '{(sum+=$4)}; END {print sum}' test.txt