佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 總結(jié)Linux中用于文本處理的awk、sed、grep命令用法

總結(jié)Linux中用于文本處理的awk、sed、grep命令用法

熱門(mén)標(biāo)簽:美團(tuán) 服務(wù)器配置 家政服務(wù)網(wǎng)絡(luò) 硅谷的囚徒呼叫中心 百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 外呼系統(tǒng) 電話機(jī)器人搭建 解決方案

awk
基礎(chǔ)概念
Awk把文件(或其他方式的輸入流, 如重定向輸入)看作一個(gè)記錄集, 把每一行看作一條記錄, 把每一行中以空格(或\t,或用戶自己指定的分隔符)分割的字符串看作一個(gè)字段.  這似乎把文件記錄看成數(shù)據(jù)庫(kù). 但是, awk仍然以行為單位逐行處理. 本例子以下面的文件(命名為s.txt)內(nèi)容做演示:

復(fù)制代碼
代碼如下:

zhangsan 1977 male computer 83
lisi 1989 male math 99
wanglijiang 1990 female chinese 78
xuliang 1977 male economic 89
xuxin 1986 female english 99
wangxuebing 1978 male math 89
lichang 1989 male math 99
wanglijiang 1990 female chinese 78
zhangsansan 1977 male computer 83
langxuebing 1978 male math 89
lisibao 1989 male math 99
xiaobao 1990 female chinese 78

一行中的5個(gè)字段分辨表示姓名, 出生年, 性別,科目,分?jǐn)?shù), 是一個(gè)很傳統(tǒng)很典型的報(bào)表文件.
Awk基本語(yǔ)法: awk ‘pattern1 {command1;command 2…; command 3}pattern2 { command …}’
pattern表示用來(lái)過(guò)濾記錄的模式, 可是是正則表達(dá)式, 關(guān)系運(yùn)算表達(dá)式, 也可以什么也沒(méi)有(表示選中所有記錄);
每個(gè)pattern選中的行記錄會(huì)被花括號(hào)括起來(lái)的命令command操作一遍, command之間用;分割. 花括號(hào)里面可以什么也沒(méi)有, 則默認(rèn)為print輸出整行記錄. Comamnd可以是輸出, 可以是算術(shù)運(yùn)算, 邏輯運(yùn)算, 循環(huán)控制等等.
先看幾個(gè)例子, 以建立對(duì)awk的命令直觀的了解.

復(fù)制代碼
代碼如下:

awk ‘/1990/’ s.txt #//直接輸出1990年出生的同學(xué);
awk ‘/chinese/{print “語(yǔ)文”; print “語(yǔ)文”}’s.txt #// 對(duì)chinese的課程的行輸出兩行”語(yǔ)文 +”;
awk ‘20>1{print “Yes”}’ s.txt #//因?yàn)?0>0,所以每行輸出Yes;
awk 'BEGIN{print "Result of the quiz:\n"}{print}END{print"---------------------------"}' s.txt

結(jié)果:
本例有3個(gè)花括號(hào),分別對(duì)應(yīng)3個(gè)模式, BEGIN和END是特殊模式,分別作用在記錄開(kāi)始前和記錄結(jié)束后.
變量: 上面說(shuō)到command可以是算術(shù)運(yùn)算, 所及運(yùn)算等, 則既然有運(yùn)算, 就有常量變量, awk可以自定義變量(不需要提前聲明, 但最好在BEGIN里面給它初始化).  Awk也維護(hù)了一組程序變量:

變量

說(shuō)明

$0

當(dāng)前記錄;

$1, $2, … $n

當(dāng)前記錄的字段

FILENAME

當(dāng)前的文件名

FS

輸入字段的分隔符, 可通過(guò)-F修改. 如: 先通過(guò)sed把空格替換為|,然后管道輸送給awk:
sed 's/ /|/g' s.txt | awk -F '|' '/chinese/{print FILENAME, $1, $5}'

NF

當(dāng)前記錄的字段數(shù)

NR

當(dāng)前記錄編號(hào)

OFS

輸出字段分隔符

ORS

輸出記錄分隔符

RS

記錄分隔符, 默認(rèn)為換行符


給一些例子來(lái)說(shuō)明這些變量的用法:

復(fù)制代碼
代碼如下:

awk ‘$4==”chinese”{print NR, $1, $4, $5}’ s.txt #//第四個(gè)字段科目為chinese的記錄編號(hào), 學(xué)生姓名, 科目和成績(jī).
awk ‘$2~/1990/{print $1}’ s.txt #//找出1990年出生的學(xué)生姓名, ~表示匹配正則表達(dá)式
awk ‘$2!~/1990/{print $1}’ s.txt #//找出不是1990年出生的學(xué)生姓名, !~表示不匹配正則表達(dá)式
awk ‘$2>”1985”{print $1, $2}’ s.txt #//找出大于1985年出生的學(xué)生姓名,年齡
awk ‘END{print “total: ” NR ”\n----------------” }’ s.txt
awk ‘BEGIN{goodChinese=0; goodMath=0}($4==”chinese”||$5>90){goodChinese++}END{print“”}

sed
sed   '2,5d' file 顯示文件file,除去2-5行,但行數(shù)超過(guò)文件實(shí)際行數(shù)時(shí)不會(huì)報(bào)錯(cuò)。
sed '/10[1-4]/d'     file 顯示文件file,除去包含101-104的行。
sed '2,$d' file 顯示文件,只顯示第一行。sed '2,$!d' file則只顯示除第一行外的其它行。
sed '/^ *$/d file 刪除文件中的空行。
sed -n '/10[1-4]/p' file
只顯示文件file中包含101-104的行。(n和p必須同時(shí)使用,否則只有p時(shí)顯示全部文件并多顯示一次找到的行)
sed -n '5p' file 只顯示文件的第5行
sed 's/moding/moden/g' file 將moding替換為moden
sed -n 's/^west/north/p' file 將west開(kāi)頭的行替換為north并顯示出來(lái)。
sed 's/[0-9][0-9][0-9]$/.5/' file 將file文件中以3個(gè)數(shù)字結(jié)尾的行替換為原數(shù)字加".5",代表搜索到的字符串。
sed 's/moding/\1en/g file 將mod做為模式1封裝在括號(hào)里,然后替換。
sed 's/...$//' file 刪除每一行的最后三個(gè)字符。
sed 's/^...//' file 刪除每一行的頭三個(gè)字符。
sed 's#moding#moden#g'   file將moding替換為moden,s后面的#代表搜索串和替換串之間的分界符。
sed -n '/101/,/105/p' file 顯示從101的匹配行到105的匹配行。如果只找到101的匹配行,則從101的匹配行到文件末。
sed -n '2,/999/p' file 顯示從第2行到匹配行。
sed'/101/,/105/s/$/  20050119/' file將從101的匹配行到105的匹配行的行末增加"       20050119"內(nèi)容。
sed -e '1,3d' -e 's/moding/moden/g'file 先刪除文件的1-3行,再進(jìn)行替換。
sed -e '/^#/!d'         file 顯示文件以#開(kāi)頭的行。
sed '/101/r newfile' file 在每個(gè)匹配行增加文件newfile的內(nèi)容
sed '/101/w newfile'    file 把匹配行寫(xiě)入newfile。
sed '/101/a new text' file 在匹配行后增加一新行。
sed '/101/i' new text' file 在匹配行前增加一新行。
sed '/101/c new text' file 用新行替換匹配行。
sed 'y/abcd/ABCD/' file 將a、b、c、d分別替換為ABCD。
sed '5q' file 顯示到第5行時(shí)退出。
sed '/101/{ n; s/moding/moden/g; }' file在文件中找到匹配行的后一行(n)再進(jìn)行替換。
sed '/101/{ s/moding/moden/g; q; }' file在文件中找到第一個(gè)匹配行后進(jìn)行替換后再退出。
sed -e '/101/{ h; d; }' -e '/104/{ G; }'file 在文件中找到與101匹配行后先存在一個(gè)緩存中,再放在與104匹配行后。
sed -e '/101/{ h; d; }' -e '/104/{ g; }'file 在文件中找到與101匹配行后先存在一個(gè)緩存中,再替代104的匹配行。
sed -e '/101/h' -e '$G' file 將最后一個(gè)匹配行放在文件末。
sed -e '/101/h' -e '$g' file 將最后一個(gè)匹配行替換文件末行。
sed -e '/101/h' -e '/104/x' file 在文件中找到與101匹配行后先存在一個(gè)緩存中,再與104的匹配行進(jìn)行互換。
echo –ltr 1.txt | sed‘s/^.* //’ 找出文件名

grep
常用的grep選項(xiàng)
-c 只輸出匹配行的計(jì)數(shù)。// 這條有時(shí)候很有用, 不需要再 | wc -l
-i 不區(qū)分大小寫(xiě)(只適用于單字符)。
-h 查詢(xún)多文件時(shí)不顯示文件名。
-l 查詢(xún)多文件時(shí)只輸出包含匹配字符的文件名。
-n 顯示匹配行及行號(hào)。
-s 不顯示不存在或無(wú)匹配文本的錯(cuò)誤信息。
-v 顯示不包含匹配文本的所有行。
例子

復(fù)制代碼
代碼如下:
grep -v "Sort" tab2
     顯示不包含匹配文本的所有行

復(fù)制代碼
代碼如下:
grep -n "Sort" tab2
     顯示匹配行及行號(hào)

復(fù)制代碼
代碼如下:
grep -c "Sort" tab2
     只輸出匹配行的計(jì)數(shù)
精確匹配:
復(fù)制代碼
代碼如下:
grep "01">" tab2


復(fù)制代碼
代碼如下:
grep -in "code" tab2
    忽略大小寫(xiě)
多次過(guò)濾

復(fù)制代碼
代碼如下:
grep -in "code" tab2 | grep "02"

補(bǔ)充說(shuō)明,grep 家族還包括fgrep和egrep。fgrep是fix grep, 允許查找字符串而不是一個(gè)模式,運(yùn)算速度快,適合于從大量數(shù)據(jù)中進(jìn)行檢索;egrep是擴(kuò)展grep,支持基本及擴(kuò)展的正則表達(dá)式,可用()及|等,但不支持q模式范圍的應(yīng)用及與之相對(duì)應(yīng)的一些更加規(guī)范的模式。

復(fù)制代碼
代碼如下:
echo aAA123bbb |egrep '[0-9]*'


復(fù)制代碼
代碼如下:
echo AAA123bbb | egrep -i '^a'

標(biāo)簽:防城港 邢臺(tái) 北海 烏蘭察布 韶關(guān) 臨沂 南昌 撫州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《總結(jié)Linux中用于文本處理的awk、sed、grep命令用法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢(xún)

    • 400-1100-266
    普格县| 镇宁| 恩平市| 那曲县| 丹寨县| 霞浦县| 方正县| 巴楚县| 龙口市| 迁西县| 罗田县| 铜陵市| 龙里县| 普陀区| 牟定县| 宝坻区| 呼玛县| 武宁县| 广宁县| 桑日县| 尉犁县| 扶风县| 孟村| 阿图什市| 吉木萨尔县| 宁德市| 扎兰屯市| 扬中市| 盐山县| 沐川县| 舒兰市| 宕昌县| 舞阳县| 巍山| 绥宁县| 阿图什市| 禹城市| 湘潭市| 边坝县| 景宁| 四平市|