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