日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

五分钟入门文本处理三剑客grep awk sed

發(fā)布時(shí)間:2025/3/20 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五分钟入门文本处理三剑客grep awk sed 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??

點(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)

選項(xiàng)含義
-v顯示不匹配行信息(反向搜索)
-i搜索時(shí)忽略大小寫(xiě)
-n顯示行號(hào)(文件中的行號(hào))
-r遞歸搜索(搜索文件夾)
-E支持?jǐn)U展正則表達(dá)式
-F不按正則表達(dá)式匹配,按照字符串字面意思匹配
cat?show.txta b c d py* i?love?python

-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?python

py被當(dāng)成正則表達(dá)式處理,我就想搜索py這個(gè)內(nèi)容,就可以用到-F選項(xiàng)

grep?-F?py*?show.txtpy*

了解的選項(xiàng)

選項(xiàng)含義
-c只輸出匹配行的數(shù)量,不顯示具體內(nèi)容
-w匹配整詞
-x匹配整行
-l只列出匹配的文件名,不顯示具體匹配行內(nèi)容
cat?show.txtlove? lovelove i?love i?love?a

-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)

選項(xiàng)含義
-C n顯示匹配行及其前后5行
-B n顯示匹配行及其前5行
-A n顯示匹配行及其后5行
cat?show.txt1 2 3 4 5 6 7

查找4及其上下2行

cat?show.txt?|?grep?-C?2?42 3 4 5 6

查找4及其前2行

grep?-B?2?4?show.txt?2 3 4

grep和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 語(yǔ)法格式解釋
BEGIN正式處理數(shù)據(jù)之前
pattern匹配模式
{commands}匹配命令,可能多行
END處理完所有匹配數(shù)據(jù)后執(zhí)行

第二種形式

standard?output?|??awk?'BEGIN{}pattern{commands}END{}'

awk的內(nèi)置變量

內(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。