linux 如何顯示一個(gè)文件的某幾行(中間幾行)
【一】從第3000行開始,顯示1000行。即顯示3000~3999行
cat filename | tail -n +3000 | head -n 1000
【二】顯示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
*注意兩種方法的順序
分解:
? ? tail -n 1000:顯示最后1000行
? ? tail -n +1000:從1000行開始顯示凶朗,顯示1000行以后的
? ? head -n 1000:顯示前面1000行
【三】用sed命令
?sed -n '5,10p' filename 這樣你就可以只查看文件的第5行到第10行惊豺。
Linux統(tǒng)計(jì)文件行數(shù)
語(yǔ)法:wc [選項(xiàng)] 文件…
說明:該命令統(tǒng)計(jì)給定文件中的字節(jié)數(shù)、字?jǐn)?shù)粱檀、行數(shù)翔曲。如果沒有給出文件名迫像,則從標(biāo)準(zhǔn)輸入讀取劈愚。wc同時(shí)也給出所有指定文件的總統(tǒng)計(jì)數(shù)瞳遍。字是由空格字符區(qū)分開的最大字符串。
該命令各選項(xiàng)含義如下:
- c 統(tǒng)計(jì)字節(jié)數(shù)菌羽。
- l 統(tǒng)計(jì)行數(shù)掠械。
- w 統(tǒng)計(jì)字?jǐn)?shù)。
這些選項(xiàng)可以組合使用注祖。
輸出列的順序和數(shù)目不受選項(xiàng)的順序和數(shù)目的影響猾蒂。
總是按下述順序顯示并且每項(xiàng)最多一列。
行數(shù)是晨、字?jǐn)?shù)肚菠、字節(jié)數(shù)、文件名
如果命令行中沒有文件名罩缴,則輸出中不出現(xiàn)文件名蚊逢。
例如:
$ wc - lcw file1 file2
4 33 file1
7 52 file2
11 11 85 total
舉例分析:
1.統(tǒng)計(jì)demo目錄下层扶,js文件數(shù)量:
find demo/ -name "*.js" |wc -l
2.統(tǒng)計(jì)demo目錄下所有js文件代碼行數(shù):
find demo/ -name "*.js" |xargs cat|wc -l 或 wc -l `find ./ -name "*.js"`|tail -n1
3.統(tǒng)計(jì)demo目錄下所有js文件代碼行數(shù),過濾了空行:
find /demo -name "*.js" |xargs cat|grep -v ^$|wc -l
1.簡(jiǎn)介
sed是非交互式的編輯器烙荷。它不會(huì)修改文件镜会,除非使用shell重定向來保存結(jié)果。默認(rèn)情況下终抽,所有的輸出行都被打印到屏幕上戳表。
sed編輯器逐行處理文件(或輸入),并將結(jié)果發(fā)送到屏幕昼伴。具體過程如下:首先sed把當(dāng)前正在處理的行保存在一個(gè)臨時(shí)緩存區(qū)中(也稱為模式空間)匾旭,然后處理臨時(shí)緩沖區(qū)中的行,完成后把該行發(fā)送到屏幕上圃郊。sed每處理完一行就將其從臨時(shí)緩沖區(qū)刪除季率,然后將下一行讀入,進(jìn)行處理和顯示描沟。處理完輸入文件的最后一行后飒泻,sed便結(jié)束運(yùn)行。sed把每一行都存在臨時(shí)緩沖區(qū)中吏廉,對(duì)這個(gè)副本進(jìn)行編輯泞遗,所以不會(huì)修改原文件。
?2.定址
定址用于決定對(duì)哪些行進(jìn)行編輯席覆。地址的形式可以是數(shù)字史辙、正則表達(dá)式、或二者的結(jié)合佩伤。如果沒有指定地址聊倔,sed將處理輸入文件的所有行。
?地址是一個(gè)數(shù)字生巡,則表示行號(hào)耙蔑;是“$"符號(hào),則表示最后一行孤荣。例如:?
sed -n '3p' datafile
只打印第三行
? 只顯示指定行范圍的文件內(nèi)容甸陌,例如:
# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log
?地址是逗號(hào)分隔的,那么需要處理的地址是這兩行之間的范圍(包括這兩行在內(nèi))盐股。范圍可以用數(shù)字钱豁、正則表達(dá)式、或二者的組合表示疯汁。例如:
sed '2,5d' datafile
#刪除第二到第五行
sed '/My/,/You/d' datafile
#刪除包含"My"的行到包含"You"的行之間的行
sed '/My/,10d' datafile
#刪除包含"My"的行到第十行的內(nèi)容
3.命令與選項(xiàng)
sed命令告訴sed如何處理由地址指定的各輸入行牲尺,如果沒有指定地址則處理所有的輸入行。
?3.1 sed命令
命令?功能
?a\
?在當(dāng)前行后添加一行或多行幌蚊。多行時(shí)除最后一行外谤碳,每行末尾需用“\”續(xù)行
c\?用此符號(hào)后的新文本替換當(dāng)前行中的文本凛澎。多行時(shí)除最后一行外,每行末尾需用"\"續(xù)行
i\?在當(dāng)前行之前插入文本估蹄。多行時(shí)除最后一行外塑煎,每行末尾需用"\"續(xù)行
d?刪除行
h?把模式空間里的內(nèi)容復(fù)制到暫存緩沖區(qū)
H?把模式空間里的內(nèi)容追加到暫存緩沖區(qū)
g?把暫存緩沖區(qū)里的內(nèi)容復(fù)制到模式空間,覆蓋原有的內(nèi)容
G?把暫存緩沖區(qū)的內(nèi)容追加到模式空間里臭蚁,追加在原有內(nèi)容的后面
l?列出非打印字符
p?打印行
n?讀入下一輸入行最铁,并從下一條命令而不是第一條命令開始對(duì)其的處理
q?結(jié)束或退出sed
r?從文件中讀取輸入行
!?對(duì)所選行以外的所有行應(yīng)用命令
s?用一個(gè)字符串替換另一個(gè)
g?在行內(nèi)進(jìn)行全局替換
w?將所選的行寫入文件
x?交換暫存緩沖區(qū)與模式空間的內(nèi)容
y?將字符替換為另一字符(不能對(duì)正則表達(dá)式使用y命令)
?3.2 sed選項(xiàng)
選項(xiàng)?功能
-e?進(jìn)行多項(xiàng)編輯,即對(duì)輸入行應(yīng)用多條sed命令時(shí)使用
-n?取消默認(rèn)的輸出
-f?指定sed腳本的文件名
4.退出狀態(tài)
sed不向grep一樣垮兑,不管是否找到指定的模式冷尉,它的退出狀態(tài)都是0。只有當(dāng)命令存在語(yǔ)法錯(cuò)誤時(shí)系枪,sed的退出狀態(tài)才不是0雀哨。
5.正則表達(dá)式元字符
?與grep一樣,sed也支持特殊元字符私爷,來進(jìn)行模式查找雾棺、替換。不同的是衬浑,sed使用的正則表達(dá)式是括在斜杠線"/"之間的模式捌浩。
如果要把正則表達(dá)式分隔符"/"改為另一個(gè)字符,比如o工秩,只要在這個(gè)字符前加一個(gè)反斜線尸饺,在字符后跟上正則表達(dá)式,再跟上這個(gè)字符即可助币。例如:sed -n '\o^Myop' datafile
元字符?功能?示例
^?行首定位符?/^my/ ?匹配所有以my開頭的行
$?行尾定位符?/my$/ ?匹配所有以my結(jié)尾的行
.?匹配除換行符以外的單個(gè)字符?/m..y/ ?匹配包含字母m浪听,后跟兩個(gè)任意字符,再跟字母y的行
*?匹配零個(gè)或多個(gè)前導(dǎo)字符?/my*/ ?匹配包含字母m,后跟零個(gè)或多個(gè)y字母的行
[]?匹配指定字符組內(nèi)的任一字符?/[Mm]y/ ?匹配包含My或my的行
[^]?匹配不在指定字符組內(nèi)的任一字符?/[^Mm]y/ ?匹配包含y眉菱,但y之前的那個(gè)字符不是M或m的行
\(..\)?保存已匹配的字符?1,20s/\(you\)self/\1r/ ?標(biāo)記元字符之間的模式迹栓,并將其保存為標(biāo)簽1,之后可以使用\1來引用它倍谜。最多可以定義9個(gè)標(biāo)簽迈螟,從左邊開始編號(hào),最左邊的是第一個(gè)尔崔。此例中,對(duì)第1到第20行進(jìn)行處理褥民,you被保存為標(biāo)簽1季春,如果發(fā)現(xiàn)youself,則替換為your消返。
&?保存查找串以便在替換串中引用?s/my/**&**/ ?符號(hào)&代表查找串载弄。my將被替換為**my**
\<?詞首定位符?/\
\>?詞尾定位符?/my\>/ ?匹配包含以my結(jié)尾的單詞的行
x\{m\}?連續(xù)m個(gè)x?/9\{5\}/ 匹配包含連續(xù)5個(gè)9的行
x\{m,\}?至少m個(gè)x?/9\{5,\}/ ?匹配包含至少連續(xù)5個(gè)9的行
x\{m,n\}?至少m個(gè)耘拇,但不超過n個(gè)x?/9\{5,7\}/ ?匹配包含連續(xù)5到7個(gè)9的行
?6.范例
?6.1 p命令
命令p用于顯示模式空間的內(nèi)容。默認(rèn)情況下宇攻,sed把輸入行打印在屏幕上惫叛,選項(xiàng)-n用于取消默認(rèn)的打印操作。當(dāng)選項(xiàng)-n和命令p同時(shí)出現(xiàn)時(shí),sed可打印選定的內(nèi)容逞刷。
?sed '/my/p' datafile
#默認(rèn)情況下嘉涌,sed把所有輸入行都打印在標(biāo)準(zhǔn)輸出上。如果某行匹配模式my夸浅,p命令將把該行另外打印一遍仑最。
sed -n '/my/p' datafile
#選項(xiàng)-n取消sed默認(rèn)的打印,p命令把匹配模式my的行打印一遍帆喇。
?6.2 d命令
命令d用于刪除輸入行警医。sed先將輸入行從文件復(fù)制到模式空間里,然后對(duì)該行執(zhí)行sed命令坯钦,最后將模式空間里的內(nèi)容顯示在屏幕上预皇。如果發(fā)出的是命令d,當(dāng)前模式空間里的輸入行會(huì)被刪除婉刀,不被顯示深啤。
sed '$d' datafile
#刪除最后一行,其余的都被顯示
sed '/my/d' datafile
#刪除包含my的行路星,其余的都被顯示
?6.3 s命令
sed 's/^My/You/g' datafile
#命令末端的g表示在行內(nèi)進(jìn)行全局替換溯街,也就是說如果某行出現(xiàn)多個(gè)My,所有的My都被替換為You洋丐。
sed -n '1,20s/My$/You/gp' datafile
#取消默認(rèn)輸出呈昔,處理1到20行里匹配以My結(jié)尾的行,把行內(nèi)所有的My替換為You友绝,并打印到屏幕上堤尾。
sed 's#My#Your#g' datafile
#緊跟在s命令后的字符就是查找串和替換串之間的分隔符。分隔符默認(rèn)為正斜杠迁客,但可以改變郭宝。無論什么字符(換行符、反斜線除外)掷漱,只要緊跟s命令粘室,就成了新的串分隔符。
?6.4 e選項(xiàng)
-e是編輯命令卜范,用于sed執(zhí)行多個(gè)編輯任務(wù)的情況下衔统。在下一行開始編輯前,所有的編輯動(dòng)作將應(yīng)用到模式緩沖區(qū)中的行上。
sed -e '1,10d' -e 's/My/Your/g' datafile
#選項(xiàng)-e用于進(jìn)行多重編輯锦爵。第一重編輯刪除第1-3行舱殿。第二重編輯將出現(xiàn)的所有My替換為Your。因?yàn)槭侵鹦羞M(jìn)行這兩項(xiàng)編輯(即這兩個(gè)命令都在模式空間的當(dāng)前行上執(zhí)行)险掀,所以編輯命令的順序會(huì)影響結(jié)果沪袭。
?6.5 r命令
r命令是讀命令。sed使用該命令將一個(gè)文本文件中的內(nèi)容加到當(dāng)前文件的特定位置上樟氢。
sed '/My/r introduce.txt' datafile
#如果在文件datafile的某一行匹配到模式My冈绊,就在該行后讀入文件introduce.txt的內(nèi)容。如果出現(xiàn)My的行不止一行嗡害,則在出現(xiàn)My的各行后都讀入introduce.txt文件的內(nèi)容焚碌。
?6.6 w命令
sed -n '/hrwang/w me.txt' datafile
?6.7 a\ 命令
a\ 命令是追加命令,追加將添加新文本到文件中當(dāng)前行(即讀入模式緩沖區(qū)中的行)的后面霸妹。所追加的文本行位于sed命令的下方另起一行十电。如果要追加的內(nèi)容超過一行,則每一行都必須以反斜線結(jié)束叹螟,最后一行除外鹃骂。最后一行將以引號(hào)和文件名結(jié)束。
sed '/^hrwang/a\
>hrwang and mjfan are husband\
>and wife' datafile
#如果在datafile文件中發(fā)現(xiàn)匹配以hrwang開頭的行罢绽,則在該行下面追加hrwang and mjfan are husband and wife
?6.8 i\ 命令
i\ 命令是在當(dāng)前行的前面插入新的文本畏线。
?6.9 c\ 命令
sed使用該命令將已有文本修改成新的文本。
?6.10 n命令
sed使用該命令獲取輸入文件的下一行良价,并將其讀入到模式緩沖區(qū)中寝殴,任何sed命令都將應(yīng)用到匹配行緊接著的下一行上。
sed '/hrwang/{n;s/My/Your/;}' datafile
注:如果需要使用多條命令明垢,或者需要在某個(gè)地址范圍內(nèi)嵌套地址蚣常,就必須用花括號(hào)將命令括起來,每行只寫一條命令痊银,或這用分號(hào)分割同一行中的多條命令抵蚊。
?6.11 y命令
該命令與UNIX/Linux中的tr命令類似,字符按照一對(duì)一的方式從左到右進(jìn)行轉(zhuǎn)換溯革。例如贞绳,y/abc/ABC/將把所有小寫的a轉(zhuǎn)換成A,小寫的b轉(zhuǎn)換成B致稀,小寫的c轉(zhuǎn)換成C冈闭。
?sed '1,20y/hrwang12/HRWANG^$/' datafile
#將1到20行內(nèi),所有的小寫hrwang轉(zhuǎn)換成大寫豺裆,將1轉(zhuǎn)換成^,將2轉(zhuǎn)換成$捻爷。
#正則表達(dá)式元字符對(duì)y命令不起作用。與s命令的分隔符一樣砚偶,斜線可以被替換成其它的字符河质。
?6.12 q命令
q命令將導(dǎo)致sed程序退出,不再進(jìn)行其它的處理蔑歌。
sed '/hrwang/{s/hrwang/HRWANG/;q;}' datafile
?6.13 h命令和g命令
#cat datafile
My name is hrwang.
Your name is mjfan.
hrwang is mjfan's husband.
mjfan is hrwang's wife.
sed -e '/hrwang/h' -e '$G' datafile
sed -e '/hrwang/H' -e '$G' datafile
#通過上面兩條命令羹应,你會(huì)發(fā)現(xiàn)h會(huì)把原來暫存緩沖區(qū)的內(nèi)容清除,只保存最近一次執(zhí)行h時(shí)保存進(jìn)去的模式空間的內(nèi)容次屠。而H命令則把每次匹配hrwnag的行都追加保存在暫存緩沖區(qū)园匹。
sed -e '/hrwang/H' -e '$g' datafile
sed -e '/hrwang/H' -e '$G' datafile
#通過上面兩條命令,你會(huì)發(fā)現(xiàn)g把暫存緩沖區(qū)中的內(nèi)容替換掉了模式空間中當(dāng)前行的內(nèi)容劫灶,此處即替換了最后一行裸违。而G命令則把暫存緩沖區(qū)的內(nèi)容追加到了模式空間的當(dāng)前行后。此處即追加到了末尾本昏。