Linux Shell輸出文本中的指定行
在Linux系統(tǒng)上如何快速查看文本中指定行呢鸦难?有時(shí)文本較大比如有10w行馍忽,想要快速查看第99行該怎么做呢扮念?
本文以文件名test.txt為例九榔,介紹3種方式快速查看test.txt的第99行芳室。相信你可以輕易的舉一反三。
使用sed
sed全名:stream editor呈枉,流編輯器,使用程序的方式來(lái)編輯文本埃碱,可以實(shí)現(xiàn)替換猖辫、刪除、新增砚殿、選取特定行等功能啃憎,是一種很hacker的方式。sed基本上使用正則表達(dá)式匹配似炎,對(duì)正則表達(dá)式要求較高辛萍。
想要快速入門sed參考sed簡(jiǎn)明教程,想要深入學(xué)習(xí)參考sed完整手冊(cè)羡藐。
sed語(yǔ)法格式:
sed [ -n ] [ -u ] Script [ File ... ]
sed [ -n ] [ -u ] [ -e Script ] ... [ -f ScriptFile ] ... [ File
... ]
關(guān)鍵Options介紹:
-
-n
: 安靜模式贩毕。一般sed用法中,所有來(lái)自STDIN的數(shù)據(jù)都會(huì)被輸出到屏幕上仆嗦,使用-n只有被sed處理的行才會(huì)列出來(lái)辉阶。如果不使用-n,使用sed打印時(shí)瘩扼,會(huì)把輸入流和處理的信息都打印一遍 -
a
:append谆甜,追加文本 -
i
:insert,插入文本 -
d
:delete集绰,刪除文本 -
s
: 模式匹配替換 -
p
:打印文本
sed使用示例
- 在指定行插入或追加: a, i
a. 在test.txt第一行前插入:sed “1 i This is a test file” test.txt
b. 在test.txt最后一行追加:sed “$ a This is the end of file” test.txt - 刪除: d
a. 刪除test.txt第二行: sed ‘2d’ test.txt
b. 刪除test.txt符合正則表達(dá)式/fish
的行: sed ‘/fish/d’ test.txt - 修改文本:s
a. 將text.txt中l(wèi)ove替換為like: sed “s/love/like/g” test.txt (/g表示全局匹配) - 打印文本: p
a. 輸出test.txt的第5-7行:sed -n ‘5,7p’ test.txt (-n的作用就顯示出來(lái)了规辱,可以去除-n查看效果)
ps: 以上命令并不會(huì)真的修改掉test.txt的內(nèi)容,如果想修改文本內(nèi)容可以使用重定向栽燕,或者使用-i
選項(xiàng)罕袋。
使用sed輸出test.txt的第99行改淑?
有了以上的sed基礎(chǔ),可以輕易得出解決方案:sed -n '99,p' test.txt
炫贤。但sed在print后并不會(huì)立即退出溅固,還會(huì)繼續(xù)搜索文件直到文件末尾,當(dāng)文件較大的時(shí)候使用sed的效率會(huì)比較低兰珍∈坦可以做如下優(yōu)化:sed -n '99,p;100q' test.txt
,打印完之后在100行退出掠河。
接分號(hào)亮元,表示打印特定行,如下命令只會(huì)打印出第一行與第十行
sed -n '1p;10p' test.txt
接逗號(hào)唠摹,表達(dá)連續(xù)的行婁爆捞,如下命令打印出第一行到第十行
sed -n '1,10p' test.txt
如下命令打印1~5行與第9行.
sed -n '1,5p;9p' test.txt
使用awk
awk: 文本處理工具,可以在文件中查找與模式匹配的行并在這些行上執(zhí)行指定的操作勾拉。awk比sed早誕生2-3年煮甥,作用與sed類似∨涸蓿快速入門awk可參考awk簡(jiǎn)明教程成肘。
awk語(yǔ)法格式
awk [ -u ] [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile |
'Program' } [ [ File ... | Assignment ... ] ] ...
awk提供了一系列內(nèi)建變量:
-
$0
: 當(dāng)前記錄(這個(gè)變量中存放著整個(gè)行的內(nèi)容) -
$1~$n
: 當(dāng)前記錄的第n個(gè)字段,字段間由FS分隔 -
FS
: 輸入字段分隔符 默認(rèn)是空格或Tab -
NF
: 當(dāng)前記錄中的字段個(gè)數(shù)斧蜕,就是有多少列 -
NR
: 已經(jīng)讀出的記錄數(shù)双霍,就是行號(hào),從1開始批销,如果有多個(gè)文件話洒闸,這個(gè)值也是不斷累加中。 -
FNR
: 當(dāng)前記錄數(shù)均芽,與NR不同的是丘逸,這個(gè)值會(huì)是各個(gè)文件自己的行號(hào) -
RS
: 輸入的記錄分隔符, 默認(rèn)為換行符 -
OFS
: 輸出字段分隔符掀宋, 默認(rèn)也是空格 -
ORS
: 輸出的記錄分隔符鸣个,默認(rèn)為換行符 -
FILENAME
: 當(dāng)前輸入文件的名字
awk使用示例:
- 打印test.txt中第一列為This的行:
awk '$1=="This"
test.txt - 打印表頭和test.txt中第一列為This的行:
awk '$1=="This" || NR == 1' test.txt
- 格式化輸出:
awk '$1=="This" || NR==1 {printf "%-20s %-20s\n",$4,$5}' test.txt
使用awk輸出test.txt的第99行?
使用內(nèi)建變量NR和FNR:
awk 'NR==99' test.txt
awk 'FNR==99' test.txt
ps: awk打印完也不會(huì)立即退出布朦,可以添加exit優(yōu)化:awk ‘NR==99 {print; exit}’ test.txt
使用head和tail組合
head和tail故名思意囤萤,相對(duì)簡(jiǎn)單,分別輸出文件或流的開頭n行或結(jié)尾n行是趴,就不在此詳細(xì)介紹了涛舍。直接給出解決方案:
tail -n+99 test.txt|head -1
很容易想到對(duì)稱的組合:head -99 test.txt|tail -1
,但是當(dāng)文件不足99行時(shí)唆途,輸出的是文件最后一行的內(nèi)容富雅。