在學習Linux命令中,發現3個有關於文件內容操作的命令grep,sed和awk,在這裡簡單彙總這3個命令主要作用,在實際中找到最合適的情景應用,詳細用法可以參考其他文章。 1、grep命令 主要作用:用於搜索文件中特定字元串,並輸出整行內行 命令格式:grep [選項參數] "搜索內容" 文件(選 ...
在學習Linux命令中,發現3個有關於文件內容操作的命令grep,sed和awk,在這裡簡單彙總這3個命令主要作用,在實際中找到最合適的情景應用,詳細用法可以參考其他文章。
1、grep命令
主要作用:用於搜索文件中特定字元串,並輸出整行內行
命令格式:grep [選項參數] "搜索內容" 文件(選項參數-r時為目錄)
選項參數:-v 反選;-i忽略大小寫;-r 遞歸;-n顯示匹配位於第幾行及內容;-c統計有多少行被匹配;-A之前多少行內容;-B之後多少行內容;-C前後多少行內容
例子:grep -n "hello" test.txt 搜索test文件中某行是否包含hello,輸出在文件中該行數和行內容
2、sed命令
主要作用:主要作用於一整行內容。可以作用於特定的行數據,也可以作用於搜索出的字元串所在的行。確定所搜索的特定字元串或行內容,可以進行輸出、刪除、寫入文件、替換操作。
命令格式:sed [選項參數] '搜索內容和搜索命令(按照一定的格式)' 文件
選項參數:-n 不需要列印多餘的輸出 -e 多條命令
搜索內容:可以包含正則匹配
搜索命令:d 刪除;p 列印;w寫入特定文件;s/// 正則匹配特定字元串替換刪除;y/// 搜索特定字元串替換刪除;&增加內容;() 匹配後為組,可在之後使用;,之間內容
例子:sed -n '/hello/p' test.txt 搜索包含hello的行,輸出
sed 's/hello/hi/' test.txt 搜索hello字元串替換為hi
sed '/^[hH]ello/s/world/planet/' test.txt 搜索行首為hello或Hello的行,將行內world字元替換為planet
sed 's/\(hello\)\(.*\)/\2 \1/' test.txt 搜索hello字元串以空格包裝,其餘的字元以另一個空格包裝,將其所有匹配到的替換為以空格包裝的重排列的字元串順序
3、awk命令
主要作用:可以用於搜索文件中特定字元串,輸出整行內容;可以按照給定的分隔符,分隔一行內容,進行一系列操作,操作代碼類似C語言代碼。
命令格式:awk [選項參數] '命令 BEGIN{代碼} {代碼} END{代碼}' 文件
選項參數:-F 分隔符;-v變數 設置變數
命令:運算符(> < + - ! in $(欄位引用) ~(匹配正則))
代碼包含:print;數組;if;while;for;
例子:
awk -F: '$1=="hello" {print $0}' test.txt 以:為分隔符,找到第一段字元為hello字元的行 輸出該行
awk '$1~/^[hH]/ {print $0}' test.txt 預設以空格為分隔符,找到第一段字元以H或h為頭字元的行 輸出該行
awk 'BEGIN{print ("company", "salarysum")} {a[$1]+=$3} END{for (i in a) print (i, a[i])}' salary.txt
第一行輸出company salarysum,下麵將第一欄位(即分公司號)作為數組的key,將第三欄位(即工資)作為數組的value相加,最後遍曆數組輸出所有的分公司號和工資總和
4、實際例子實操
4.1 linux中訪問日誌如下:
10/Jan/2019:09:10:12
10/Jan/2019:09:13:39
10/Jan/2019:09:15:41
10/Jan/2019:09:40:45
10/Jan/2019:10:22:32
10/Jan/2019:11:24:22
10/Jan/2019:11:24:49
10/Jan/2019:16:55:23
統計每5分鐘的主機訪問數量
4.2 訪問日誌ip如下:
192.168.0.1 success
192.168.0.2 success
192.168.0.3 success
192.168.0.2 failed
192.168.0.1 success
192.168.0.1 failed
192.168.0.4 success
統計有多少單獨個ip訪問、找到訪問最頻繁的2個ip、訪問2次以上的ip
4.1 awk -F: '{a[$2":"$3-$3%5]+=1}END{for (i in a) print(i, a[i])}' log | sort
4.2 awk '{print $1}' log | sort -n | uniq | wc -l
awk '{print $1}' log | sort -n | uniq -c | sort -nr | head -n 2
awk '{print $1}' log | sort -n | uniq -c | awk '$1>=2 {print $0}'
寫博客的目的首先為的自己有所長進,如果能幫到您,我非常高興的。
勤加思考,行動起來,祝我們喜歡自己。