五分钟入门文本处理三剑客grep awk sed
??
點擊上方?好好學java?,選擇?星標?公眾號
重磅資訊、干貨,第一時間送達 今日推薦:Spring Boot + Vue 如此強大?竟然可以開發基于 C/S 架構的應用個人原創+1博客:點擊前往,查看更多介紹
grep awk sed是Linux下文本處理常用的命令,能完成很多神奇的操作,今天就分享一下這三個命令最常見的用法
grep
使用一般有如下兩種形式
第一種形式
grep?[option]?[pattern]?[file1,file2]如查找show.txt里面包含content的行
grep?content?show.txt第二種形式
command?|?grep?[option]?[pattern]如查看某個服務信息
ps?-ef?|?grep?mongo如查找show.txt里面包含content的行
cat?show.txt?|?grep?content必須掌握的選項
| -v | 顯示不匹配行信息(反向搜索) |
| -i | 搜索時忽略大小寫 |
| -n | 顯示行號(文件中的行號) |
| -r | 遞歸搜索(搜索文件夾) |
| -E | 支持擴展正則表達式 |
| -F | 不按正則表達式匹配,按照字符串字面意思匹配 |
-v 選項
grep?-v?a?show.txtb c d *py i?love?python-n選項
grep?-n?a?show.txt?1:a-r選項 查找/etc/myconfig及其子目錄下,打印出包含content字符串所在行的內容
?grep?-r?content?/etc/myconfig-F選項
grep?py*?show.txt?py* i?love?pythonpy被當成正則表達式處理,我就想搜索py這個內容,就可以用到-F選項
grep?-F?py*?show.txtpy*了解的選項
| -c | 只輸出匹配行的數量,不顯示具體內容 |
| -w | 匹配整詞 |
| -x | 匹配整行 |
| -l | 只列出匹配的文件名,不顯示具體匹配行內容 |
-w選項(lovelove這個詞沒有顯示出來,因為love前后得有空格或者tab才會認為是一個單詞)
grep?-w?love?show.txtlove? i?love i?love?a-x 選項(匹配行,行的內容只能是i love a)
grep?-x?"i?love?a"?show.txti?love?a這些選項可以混著用,例如
查找/etc/myconfig及其子目錄下,打印出包含content字符串所在文件的文件名
grep?-rl?abc?/etc/myconfig-r:遞歸搜索(搜索文件夾) -l:只列出匹配的文件名,不顯示具體匹配行內容
當然用find也是可以的,只不過麻煩一點
find?/etc/myconfig?-type?f?|?xargs?grep?-l?abc?這個命令在看配置的是時候還是挺管用的
查看日志常用的選項
| -C n | 顯示匹配行及其前后5行 |
| -B n | 顯示匹配行及其前5行 |
| -A n | 顯示匹配行及其后5行 |
查找4及其上下2行
cat?show.txt?|?grep?-C?2?42 3 4 5 6查找4及其前2行
grep?-B?2?4?show.txt?2 3 4grep和egrep的區別和聯系
grep默認不支持擴展正則表達式,只支持基礎正則表達式 使用grep -E 可以支持擴展正則表達式 使用egrep可以支持擴展正則表達式,與grep -E等價
awk
使用一般有如下兩種形式
第一種形式
awk?'BEGIN{}pattern{commands}END{}'?file_name| BEGIN | 正式處理數據之前 |
| pattern | 匹配模式 |
| {commands} | 匹配命令,可能多行 |
| END | 處理完所有匹配數據后執行 |
第二種形式
standard?output?|??awk?'BEGIN{}pattern{commands}END{}'awk的內置變量
| $0 | 整行內容 |
| n | 當前行的第1-n個字段(按照指定分隔符分割后) |
| NF(Number Field) | 當前行的字段個數,也就是多少列 |
| NR(Number Row) | 當前行的行號,從1開始計數 |
| FNR(File Number Row) | 多文件處理時,每個文件行號單獨計數,都是從0開始 |
| FS(Field Separator) | 輸入字段分割符。不指定默認以空格或者Tab鍵分割 |
| RS(Row Separator) | 輸入行分割符。默認回車\n |
| OFS(Output Field Sepatator) | 輸出字段分割符。默認為空格 |
| ORS(Output Row) | 輸出行分隔符。默認為回車 |
| FILENAME | 當前輸入的文件名字 |
| ARGC | 命令行參數個數 |
| ARGV | 命令行參數數組 |
看一下/etc/passwd文件的內容
cat?/etc/passwdroot:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin輸出文件的每行內容
#?$0為整行內容 awk?'{print?$0}'?/etc/passwdroot:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin輸出第二列內容
需要指定分隔符:
#?$2為第二列內容 awk?'BEGIN{FS=":"}{print?$2}'?/etc/passwdx x x不需要指定分割符,默認空格,tab鍵,多個也可以分隔(如一個空格+一個tab鍵)
cat?show.txt#?空格分隔 python?java?php #?tab鍵分隔 flink?hadoop?storm輸出第一列內容
awk?'{print?$1}'?show.txtpython flink輸出每一行有多少列
awk?'{print?NF}'?show.txt3 3可以用這個輸出每一行的最后一列的值
awk?'{print?$NF}'?show.txt輸出行號
awk?'{print?NR}'?show.txt1 2對每個文件的行號單獨計數(顯示show.txt和/etc/passwd文件的行號,不累加)
awk?'{print?FNR}'?show.txt?/etc/passwd1 2 1 2 ...同時指定行分隔符和列分隔符
cat?show.txtpython|java|php--flink|hadoop|storm先輸出每一行數據
#?RS為指定行分隔符 awk?'BEGIN{RS="--"}{print?$0}'?show.txtpython|java|php flink|hadoop|storm輸出每一行的第二列
#?RS指定行分隔符 #?FS指定列分隔符 awk?'BEGIN{RS="--";FS="|"}{print?$2}'?show.txtjava hadoop在上面基礎上指定行分隔符
#?ORS?輸出行分割符 awk?'BEGIN{RS="--";FS="|";ORS="&"}{print?$2}'?show.txtjava&hadoop&再次指定列分隔符
#?OFS輸出列分隔符 awk?'BEGIN{RS="--";FS="|";ORS="&";OFS="@@"}{print?$1,$2}'?show.txtpython@@java&flink@@hadoop&輸出文件名字
cat?show.txtpython|java|php flink|hadoop|storm awk?'{print?FILENAME}'?show.txtshow.txt show.txt因為是對行進行處理,所以有幾行,輸出幾次文件名
當然awk還有其他強大的操作,如支持函數,流程控制,格式化輸出等。有興趣的可以了解一下awk編程,這里就不再多做介紹了
假如有一個如下的訪問日志request.log
2020-05-21 request enter 2020-05-21 request ip 127.0.0.1 2020-05-21 request finish 2020-05-21 request enter 2020-05-21 request error 2020-05-21 request enter 2020-05-21 request ip 127.0.0.1 2020-05-21 request finish 2020-05-21 request enter 2020-05-21 request ip 11.25.58.21 2020-05-21 request finish想統計當日去重后的ip有多少個,就可執行如下命令
#?sort為排序,uniq為去重 cat?request.log?|?grep?ip?|?awk?'{print?$4}'?|?sort?|?uniq 11.25.58.21 127.0.0.1我原來維護了一個hadoop集群,當想關閉集群中的所有DataNode節點(可以認為一個應用),假如每個機器jps,查看pid,kill。很麻煩,直接寫了一個腳本,依次ssh到各個節點,然后執行如下命令即可,超級省事
kill?`jps?|?grep?'DataNode'?|?awk?'{print?$1}'`sed
sed的功能和文本編輯器有點類似,因為我在Linux對文本進行修改用vim比較多,sed的話可能在腳本中用的多一點,因此也沒多少經驗,簡單介紹一個替換的示例
cat?show.txt? this?is?a?test?for?sed this?is?second?line#?將second替換為first輸出到屏幕,文件內容并沒有改變 #?有選項可以指定,不再介紹 sed?'s/second/first/'?show.txt this?is?a?test?for?sed this?is?first?line 最后,再附上我歷時三個月總結的?Java 面試 + Java 后端技術學習指南,這是本人這幾年及春招的總結,目前,已經拿到了大廠offer,拿去不謝!下載方式1.?首先掃描下方二維碼 2.?后臺回復「Java面試」即可獲取總結
以上是生活随笔為你收集整理的五分钟入门文本处理三剑客grep awk sed的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 300 行代码带你秒懂 Java 多线程
- 下一篇: 10分钟白嫖我常用的20个在线工具类网站