linux環境下批量更改文件的後綴名 awk好文檔

舉例說明,批量將文件的後綴名由result更改爲pcap

方法一、

$rename 's/result/pcap' *.result

方法二、

$ll |awk '{split($9,a,".");print a[1]}'|xargs -i mv {}.result {}.pcap

awk sed grep

https://www.jianshu.com/p/391d7766e9f3

awk 好文檔

https://segmentfault.com/a/1190000019525275?utm_source=tag-newest#articleHeader3


1)NF(number of field)表示一行中的區域(列)數量,$NF取最後一個區域。

2)$符號表示取某個列(區域),$1,$2,$NF

3)NR (number of record) 行號,awk對每一行的記錄號都有一個內置變量NR來保存,每處理完一條記錄NR的值就會自動+1

4)FS(-F)field separator 列分隔符,以什麼把行分隔成多列

3.1 指定分隔符
[root@creditease awk]# awk -F "#" '{print $NF}' awk.txt 
GKL$123
GKL$213
GKL$321
[root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt 
123
213
321
3.2 條件動作基本的條件和動作
[root@creditease awk]# cat awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txt
ABC
3.3 只有條件
 [root@creditease awk]# awk -F "#" 'NR==1' awk.txt
ABC#DEF#GHI#GKL$123
默認會有動作{print $0}

3.4 只有動作
[root@creditease awk]# awk -F "#" '{print $1}' awk.txt
ABC
BAC
CAB
默認處理所有行

3.5 多個模式和動作
[root@creditease awk]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt 
GKL$123
GKL$321
3.6 對$0的認識
awk中$0表示整行

[root@creditease awk]# awk '{print $0}' awk_space.txt
ABC DEF GHI GKL$123
BAC DEF GHI GKL$213
CBA DEF GHI GKL$321
3.7 FNR
FNR與NR類似,不過多文件記錄不遞增,每個文件都從1開始(後邊處理多文件會講到)

[root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt 
1
2
3
4
5
6
[root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt 
1
2
3
1
2
3
四、正則表達式與操作符
awk同sed一樣也可以通過模式匹配來對輸入的文本進行匹配處理。
awk也支持大量的正則表達式模式,大部分與sed支持的元字符類似,而且正則表達式是玩轉三劍客的必備工具。

awk支持的正則表達式元字符

圖片描述

awk默認不支持的元字符,和需要添加參數才能支持的元字符

元字符    功能    示例    解釋
x{m}    x重複m次    /cool{5}/    需要注意一點的是,cool加括號或不加括號的區別,x可以使字符串也可以只是一個字符,所以/cool{5}/表示匹配coo再加上5個l,即coolllll。/(cool){2,}/表示匹配coolcool,coolcoolcool等。
x{m,}    x重複至少m次    /(cool){2,}/    同上
x{m,n}    x重複至少m次,但不超過n次,需要指定參數:--posix或者--re-interval。沒有該參數不能使用這種模式    /(cool){5,6}/    同上
正則表達式的運用,默認是在行內查找匹配的字符串,若有匹配則執行action操作,但是有時候僅需要固定的列表匹配指定的正則表達式。

比如:

我想取/etc/passwd文件中第五列($5)這一列查找匹配mail字符串的行,這樣就需要用另外兩個匹配操作符。並且awk裏面只有這兩個操作符來匹配正則表達式的。

正則匹配操作符
~    用於對記錄或區域的表達式進行匹配。
!~    用於表達與~相反的意思。
4.1 正則實例
1)顯示awk.txt中GHI列

[root@creditease awk]# cat awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '{print $3}' awk.txt 
GHI
GHI
GHI
[root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt 
GHI
GHI
GHI
2)顯示包含321的行

[root@creditease awk]# awk '/321/{print $0}' awk.txt 
CBA#DEF#GHI#GKL$321
3)以#爲分隔符,顯示第一列以B開頭或最後一列以1結尾的行

[root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
4)以#爲分隔符,顯示第一列以B或C開頭的行

[root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
五、比較表達式
awk是一種編程語言,能夠進行更爲複雜的判斷,當條件爲真時,awk就執行相關的action,主要是在針對某一區域做出相關的判斷,比如打印成績在80分以上的,這樣就必須對這一個區域作比較判斷.

下表列出了awk可以使用的關係運算符,可以用來比較數字字符串,還有正則表達式,當表達式爲真的時候,表達式結果爲1,否則爲0,只有表達式爲真,awk才執行相關的action。

awk支持的關係運算符

運算符    含義    示例
<    小於    x>y
<=    小於或等於。    x<=y
==    等於    x==y
!=    不等於    x!=y
>=    大於或等於    x>=y
>    大於    x<y
5.1 比較表達式實例
顯示awk.txt的第2 ,3 行

NR //,//

[root@creditease awk]# awk 'NR==2{print $0}NR==3{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk 'NR>=1{print $0}' awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk '/BAC/,/CBA/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
第二篇 awk模塊、變量與執行
完整awk結構圖如下:

一、BEGIN模塊
BEGIN模塊在awk讀取文件之前就執行,BEGIN模式常常被用來修改內置變量ORS,RS,FS,OFS等的值。可以不接任何輸入文件

二、awk內置變量(預定義變量)
變量名    屬性
$0    當前記錄,一整行
$1,$2,$3....$a    當前記錄的第n個區域,區域間由FS分隔。
FS    輸入區域分隔符,默認是空格。field separator
NF    當前記錄中的區域個數,就是有多少列。number of field
NR    已經讀出的記錄數,就是行號,從1開始。number of record
RS    輸入的記錄分隔符默認爲換行符。record separator
OFS    輸出區域分隔符,默認也是空格。output record separator
FNR    當前文件的讀入記錄號,每個文件重新計算。
FILENAME    當前正在處理的文件的文件名
特別提示:FS RS支持正則表達式

2.1 第一個作用: 定義內置變量
[root@creditease awk]# awk 'BEGIN{RS="#"}{print $0}' awk.txt 
ABC
DEF
GHI
GKL$123
BAC
DEF
GHI
GKL$213
CBA
DEF
GHI
GKL$321
2.2 第二個作用:打印標識
[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}' awk.txt 
=======start======
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
2.3 awk實現計算功能
 [root@creditease files]# awk 'BEGIN{a=8;b=90;print a+b,a-c,a/b,a%b}'
98 8 0.0888889 8
三、END模塊
END在awk讀取完所有的文件的時候,再執行END模塊,一般用來輸出一個結果(累加,數組結果)。也可以是和BEGIN模塊類似的結尾標識信息。

3.1 第一個作用:打印標識
[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}END{print "=======end======"}' awk.txt
=======start======
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
=======end======
3.2 第二個作用:累加
1)統計空行(/etc/services文件)

grep sed awk

[root@creditease awk]# grep "^$" /etc/services  |wc -l
17
[root@creditease awk]# sed -n '/^$/p' /etc/services |wc -l
17
[root@creditease awk]# awk '/^$/' /etc/services |wc -l
17
[root@creditease awk]# awk '/^$/{i=i+1}END{print i}' /etc/services
17
2)算術題

1+2+3......+100=5050,怎麼用awk表示?

[root@creditease awk]# seq 100|awk '{i=i+$0}END{print i}'
5050
四、awk詳解小結
1、BEGIN和END模塊只能有一個,BEGIN{}BEGIN{}或者END{}END{}都是錯誤的。

2、找誰幹啥模塊,可以是多個。

五、awk執行過程總結


awk執行過程:

1、命令行的賦值(-F或-V)

2、執行BEGIN模式裏面的內容

3、開始讀取文件

4、判斷條件(模式)是否成立

成立則執行對應動作裏面的內容
讀取下一行,循環判斷
直到讀取到最後一個文件的結尾
5、最後執行END模式裏面的內容

第三篇:awk數組與語法
一、awk數組
1.1 數組結構


people[police]=110

people[doctor]=120

[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";print word[0],word[1]}'
credit easy
[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";for(i in word)print word[i]}'
credit
easy
1.2 數組分類

引數組:以數字爲下標
關聯數組:以字符串爲下標

1.3 awk關聯數組
現有如下文本,格式如下:即左邊是隨機字母,右邊是隨機數字, 即將相同的字母后面的數字加在一起,按字母的順序輸出

a  1
b  3
c  2
d  7
b  5
a  3 
g  2
f  6
以$1爲下標,創建數組a[$1]=a[$1]+$2(a[$1]+=$2)然後配合END和for循環輸出結果:

[root@creditease awk]# awk '{a[$1]=a[$1]+$2}END{for(i in a)print i,a[i]}' jia.txt 
a 4
b 8
c 2
d 7
f 6
g 2
注意:for(i in a) 循環的順序不是按照文本內容的順序來處理的,排序可以在命令後加sort排序
1.4 awk索引數組
以數字爲下標的數組
seq生成1-10的數字,要求只顯示計數行

[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR;i+=2){print a[i]}}'
1
3
5
7
9
seq生成1-10的數字,要求不顯示文件的後3行

[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR-3;i++){print a[i]}}'
1
2
3
4
5
6
7
解析:改變i的範圍即可,多用於不顯示文件的後幾行
1.5 awk數組實戰去重
a++ 和 ++a

[root@creditease awk]# awk 'BEGIN{print a++}'
0
[root@creditease awk]# awk 'BEGIN{print ++a}'
1
[root@creditease awk]# awk 'BEGIN{a=1;b=a++;print a,b}'
2 1
[root@creditease awk]# awk 'BEGIN{a=1;b=++a;print a,b}'
2 2

注:

都是 b = a+1

b=a++ 先把 a 的值賦予b,然後 a + 1

b=++a 先執行a+1,然後把a的值賦予b
對一下文本進行去重處理 針對第二列去重

[root@creditease awk]# cat qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/12   xiaoli     13373305025
2018/11/19   xiaozhao   15512013263
2018/11/26   xiaoliu    18615517895
2018/12/01   xiaoma     16965564525
2018/12/09   xiaowang   17712215986
2018/11/24   xiaozhao   15512013263
解法一:
[root@creditease awk]# awk '!a[$2]++' qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/19   xiaozhao   15512013263
2018/12/01   xiaoma     16965564525
解析:
!a[$3]++是模式(條件),命令也可寫成awk '!
a[$3]=a[$3]+1{print $0}' qc.txt
a[$3]++ ,“++”在後,先取值後加一
!a[$3]=a[$3]+1:是先取a[$3]的值,比較“!a[$3]”是否符合條件(條件非0),後加1
注意:此方法去重後的結果顯示的是文本開頭開始的所有不重複的行
解法二:
[root@creditease awk]# awk '++a[$2]==1' qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/19   xiaozhao   15512013263
2018/12/01   xiaoma     16965564525
解析:
++a[$3]==1是模式(條件),也可寫成a[$3]=a[$3]+1==1即只有當條件(a[$3]+1的結果)爲1的時候纔打印出內容
++a[$3] ,“++”在前,先加一後取值
++a[$3]==1:是先加1,後取a[$3]的值,比較“++a[$3]”是否符合條件(值爲1)
注意:此方法去重後的結果顯示的是文本開頭開始的所有不重複的行
解法三:
[root@creditease awk]# awk '{a[$2]=$0}END{for(i in a){print a[i]}}' qc.txt
2018/11/12   xiaoli     13373305025
2018/11/26   xiaoliu    18615517895
2018/12/01   xiaoma     16965564525
2018/12/09   xiaowang   17712215986
2018/11/24   xiaozhao   15512013263

解析:
注意此方法去重後的結果顯示的是文本結尾開始的所有不重複的行
1.6 awk處理多個文件(數組、NR、FNR)
使用awk取file.txt的第一列和file1.txt的第二列然後重定向到一個新文件new.txt中

[root@creditease awk]# cat file1.txt 
a b
c d
e f
g h
i j
[root@creditease awk]# cat file2.txt 
1 2
3 4
5 6
7 8
9 10
[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2}' file1.txt file2.txt 
a 2
c 4
e 6
g 8
i 10
解析:NR==FNR處理的是第一個文件,NR!=FNR處理的是第二個文件.
注意:當兩個文件NR(行數)不同的時候,需要把行數多的放前邊.
解決方法:把行數多的文件放前邊,行數少的文件放後邊.
把輸出的結果放入一個新文件new.txt中:
[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2>"new.txt"}' file1.txt file2.txt 
[root@creditease awk]# cat new.txt 
a 2
c 4
e 6
g 8
i 10
1.7 awk分析日誌文件,統計訪問網站的個數
[root@creditease awk]# cat url.txt 
http://www.baidu.com
http://mp4.video.cn
http://www.qq.com
http://www.listeneasy.com
http://mp3.music.com
http://www.qq.com
http://www.qq.com
http://www.listeneasy.com
http://www.listeneasy.com
http://mp4.video.cn
http://mp3.music.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
[root@creditease awk]# awk -F "[/]+" '{h[$2]++}END{for(i in h) print i,h[i]}' url.txt
www.qq.com 3
www.baidu.com 5
mp4.video.cn 2
mp3.music.com 2
www.crediteasy.com 3
二、awk簡單語法
2.1 函數sub gsub
替換功能

格式:sub(r, s ,目標) gsub(r, s ,目標)

[root@creditease awk]# cat sub.txt 
ABC DEF AHI GKL$123
BAC DEF AHI GKL$213
CBA DEF GHI GKL$321
[root@creditease awk]# awk '{sub(/A/,"a");print $0}' sub.txt 
aBC DEF AHI GKL$123
BaC DEF AHI GKL$213
CBa DEF GHI GKL$321
[root@creditease awk]# awk '{gsub(/A/,"a");print $0}' sub.txt 
aBC DEF aHI GKL$123
BaC DEF aHI GKL$213
CBa DEF GHI GKL$321
注:sub只會替換行內匹配的第一次內容;相當於sed ‘s###’
    gsub 會替換行內匹配的所有內容;相當於sed ‘s###g’
[root@creditease awk]# awk '{sub(/A/,"a",$1);print $0}' sub.txt 
aBC DEF AHI GKL$123
BaC DEF AHI GKL$213
CBa DEF GHI GKL$321
練習:

0001|20081223efskjfdj|EREADFASDLKJCV
0002|20081208djfksdaa|JDKFJALSDJFsddf
0003|20081208efskjfdj|EREADFASDLKJCV
0004|20081211djfksdaa1234|JDKFJALSDJFsddf
以'|'爲分隔, 現要將第二個域字母前的數字去掉,其他地方都不變, 輸出爲:
0001|efskjfdj|EREADFASDLKJCV
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV
0004|djfksdaa1234|JDKFJALSDJFsddf

方法:
awk -F '|'  'BEGIN{OFS="|"}{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt
awk -F '|'  -v OFS="|" '{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt
2.2 if和slse的用法
內容:

AA

BC

AA

CB

CC

AA

結果:

AA YES

BC NO YES

AA YES

CB NO YES

CC NO YES

AA YES

1) [root@creditease awk]# awk '{if($0~/AA/){print $0" YES"}else{print $0" NO YES"}}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:使用if和else,if $0匹配到AA,則打印$0 "YES",else反之打印$0 " NO YES"。
2)[root@creditease awk]# awk '$0~/AA/{print $0" YES"}$0!~/AA/{print $0" NO YES"}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:使用正則匹配,當$0匹配AA時,打印出YES,反之,打印出“NO YES”
2.3 next用法
如上題,用next來實現

next :跳過它後邊的所有代碼

 [root@creditease awk]# awk '$0~/AA/{print $0" YES";next}{print $0" NO YES"}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:
{print $0" NO YES"}:此動作是默認執行的,當前邊的$0~/AA/匹配,就會執行{print $0" YES";next}
因爲action中有next,所以會跳過後邊的action。
如果符合$0~/AA/則打印YES ,遇到next後,後邊的動作不執行;如果不符合$0~/AA/,會執行next後邊的動作;
next前邊的(模式匹配),後邊的就不執行,前邊的不執行(模式不匹配),後邊的就執行。
2.4 printf不換行輸出以及next用法
printf :打印後不換行

如下文本,如果 Description:之後爲空,將其後一行內容併入此行。

Packages: Hello-1
Owner: me me me me
Other: who care?
Description:
Hello world!
Other2: don't care
想要結果:
Packages: Hello-1
Owner: me me me me
Other: who care?
Description: Hello world!
Origial-Owner: me me me me
Other2: don't care
1)[root@creditease awk]# awk '/^Desc.*:$/{printf $0}!/Desc.*:$/{print $0}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
解析:使用正則匹配,匹配到'/^Desc.*:$/,就使用printf打印(不換行),不匹配的打印出整行。
2)使用if和else實現
[root@creditease awk]# awk '{if(/Des.*:$/){printf $0}else{print $0}}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
3)使用next實現
[root@creditease awk]# awk '/Desc.*:$/{printf $0;next}{print $0}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
注:可簡寫成awk '/Desc.*:$/{printf $0;next}1'
printf.txt  ## 1是pattern(模式),默認action(動作)是{print $0}
2.5 去重後計數按要求重定向到指定文件
文本如下,要求計算出每項重複的個數,然後把重複次數大於2的放入gt2.txt文件中,把重複次數小於等於2的放入le2.txt文件中

[root@creditease files]# cat qcjs.txt 
aaa
bbb
ccc
aaa
ddd
bbb
rrr
ttt
ccc
eee
ddd
rrr
bbb
rrr
bbb
[root@creditease awk]# awk '{a[$1]++}END{for(i in a){if(a[i]>2){print i,a[i]>"gt2.txt"}else{print i,a[i]>"le2.txt"}}}' qcjs.txt 
[root@creditease awk]# cat gt2.txt 
rrr 3
bbb 4
[root@creditease awk]# cat le2.txt 
aaa 2
ccc 2
eee 1
ttt 1
ddd 2
解析:{print },或括號中打印後可直接重定向到一個新文件,文件名用雙引號引起來。如: {print $1 >"xin.txt"}
三、awk需注意事項
a)NR==FNR ##不能寫成NR=FNR(=在awk中是賦值的意思)

b)NR!=FNR ##NR不等於FNR

c){a=1;a[NR]} 這樣會報錯:同一條命令中變量和數組名不能重複
d)printf 輸出的時候不換行

e){print },或括號中打印後可直接重定向到一個新文件,文件名用雙引號引起來。如: {print $1 >"xin.txt"}

f)當模式(條件)是0的時候,後邊的動作不執行,!0的時候後邊動作才執行。

sed 好文檔

sed在處理文本時是逐行讀取文件內容,讀到匹配的行就根據指令做操作,不匹配就跳過。

sed是Linux下一款功能強大的非交互流式文本編輯器,可以對文本文件進行增、刪、改、查等操作,支持按行、按字段、按正則匹配文本內容,靈活方便,特別適合於大文件的編輯。本文主要介紹sed的一些基本用法,並通過shell腳本演示sed的使用實例。

1.sed的使用方法,調用sed 命令的語法有兩種:

一.在命令行指定sed指令對文本進行處理:sed +選項  ‘指令’ 文件

二.先將sed指令保存到文件中,將該文件作爲參數進行調用:sed   +選項  -f  包含sed指令的文件  文件

sed的常用選項:

-e:它告訴sed將下一個參數解釋爲一個sed指令,只有當命令行上給出多個sed指令時才需要使用-e選項

-f:後跟保存了sed指令的文件

-i:直接對內容進行修改,不加-i時默認只是預覽,不會對文件做實際修改

-n:取消默認輸出,sed默認會輸出所有文本內容,使用-n參數後只顯示處理過的行

sed中的編輯命令:

a:追加  向匹配行後面插入內容

c:更改  更改匹配行的內容

i:插入  向匹配行前插入內容

d:刪除  刪除匹配的內容

s:替換  替換掉匹配的內容

p:打印  打印出匹配的內容,通常與-n選項和用

=:用來打印被匹配的行的行號

n:讀取下一行,遇到n時會自動跳入下一行

r,w:讀和寫編輯命令,r用於將內容讀入文件,w用於將匹配內容寫入到文件

2.sed命令實例:

示例1:向文件中添加或插入行

sed '3ahello' 1.txt   #向第三行後面添加hello,3表示行號

sed '/123/ahello' 1.txt #向內容123後面添加hello,如果文件中有多行包括123,則每一行後面都會添加

sed  '$ahello'  1.txt  #在最後一行添加hello

sed '3ihello'  1.txt    #在第三行之前插入hello

sed '/123/ihello'  1.txt   #在包含123的行之前插入hello,如果有多行包含123,則包含123的每一行之前都會插入hello

sed '$ihello'  1.txt     #在最後一行之前插入hello

示例2:更改文件中指定的行

sed  '1chello'  1.txt  #將文件1.txt的第一行替換爲hello

sed  '/123/chello'  1.txt  #將包含123的行替換爲hello

sed '$chello'  1.txt  #將最後一行替換爲hello

示例3:刪除文件中的行

sed  '4d'  1.txt    #刪除第四行

sed '1~2d' 1.txt   #從第一行開始刪除,每隔2行就刪掉一行,即刪除奇數行

sed   '1,2d'  1.txt   #刪除1~2行

sed  '1,2!d'  1.txt   #刪除1~2之外的所有行

sed  '$d'   1.txt      #刪除最後一行

sed  '/123/d'   1.txt   #刪除匹配123的行

sed  '/123/,$d'  1.txt  #刪除從匹配123的行到最後一行

sed  '/123/,+1d'  1.txt   #刪除匹配123的行及其後面一行

sed  '/^$/d'    1.txt    #刪除空行

sed   '/123\|abc/!d'  1.txt    #刪除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反

sed  '1,3{/123/d}'   1.txt     #刪除1~3行中,匹配內容123的行,1,3表示匹配1~3行,{/123/d}表示刪除匹配123的行

示例4:替換文件中的內容

sed  's/123/hello/'   1.txt   #將文件中的123替換爲hello,默認只替換每行第一個123

sed  's/123/hello/g'  1.txt #將文本中所有的123都替換爲hello

sed 's/123/hello/2'   1.txt  #將每行中第二個匹配的123替換爲hello

sed  -n 's/123/hello/gpw  2.txt'   1.txt    #將每行中所有匹配的123替換爲hello,並將替換後的內容寫入2.txt

sed  '/#/s/,.*//g'  1.txt   #匹配有#號的行,替換匹配行中逗號後的所有內容爲空  (,.*)表示逗號後的所又內容

sed  's/..$//g'  1.txt  #替換每行中的最後兩個字符爲空,每個點代表一個字符,$表示匹配末尾  (..$)表示匹配最後兩個字符

sed 's/^#.*//'  1.txt      #將1.txt文件中以#開頭的行替換爲空行,即註釋的行  ( ^#)表示匹配以#開頭,(.*)代表所有內容

sed 's/^#.*//;/^$/d'  1.txt  #先替換1.txt文件中所有註釋的空行爲空行,然後刪除空行,替換和刪除操作中間用分號隔開

sed 's/^[0-9]/(&)/'   1.txt   #將每一行中行首的數字加上一個小括號   (^[0-9])表示行首是數字,&符號代表匹配的內容

或者  sed 's/[0−9][0−9]/(\1)/'   1.txt  #替換左側特殊字符需鑰轉義,右側不需要轉義,\1代表匹配的內容

sed  's/$/&'haha'/'  1.txt   # 在1.txt文件的每一行後面加上"haha"字段

示例5:打印文件中的行

sed  -n '3p'  1.txt   #打印文件中的第三行內容

sed  -n '2~2p'  1.txt   #從第二行開始,每隔兩行打印一行,波浪號後面的2表示步長

sed -n '$p'  1.txt  #打印文件的最後一行

sed -n '1,3p'  1.txt  #打印1到3行

sed  -n '3,$p'  1.txt  #打印從第3行到最後一行的內容

sed  -n '/you/p'  1.txt   #逐行讀取文件,打印匹配you的行

sed  -n '/bob/,3p'  1.txt  #逐行讀取文件,打印從匹配bob的行到第3行的內容

sed  -n  '/you/,3p'  1.txt  #打印匹配you 的行到第3行,也打印後面所有匹配you 的行

sed  -n '1,/too/p'  1.txt    #打印第一行到匹配too的行

sed  -n  '3,/you/p'  1.txt   #只打印第三行到匹配you的行

sed  -n '/too/,$p'  1.txt  #打印從匹配too的行到最後一行的內容

sed  -n '/too/,+1p'  1.txt    #打印匹配too的行及其向後一行,如果有多行匹配too,則匹配的每一行都會向後多打印一行

sed  -n '/bob/,/too/p'  1.txt   #打印從匹配內容bob到匹配內容too的行

示例6:打印文件的行號

sed  -n "$="   1.txt   #打印1.txt文件最後一行的行號(即文件有多少行,和wc -l 功能類似)

sed  -n '/error/='  1.txt     #打印匹配error的行的行號

sed  -n '/error/{=;p}'   1.txt    #打印匹配error的行的行號和內容(可用於查看日誌中有error的行及其內容)

示例7:從文件中讀取內容

sed  'r 2.txt'  1.txt  #將文件2.txt中的內容,讀入1.txt中,會在1.txt中的每一行後都讀入2.txt的內容

sed '3r 2.txt'  1.txt       #在1.txt的第3行之後插入文件2.txt的內容(可用於向文件中插入內容)

sed  '/245/r   2.txt'   1.txt    #在匹配245的行之後插入文件2.txt的內容,如果1.txt中有多行匹配456則在每一行之後都會插入

sed  '$r  2.txt'   1.txt     #在1.txt的最後一行插入2.txt的內容

示例8:向文件中寫入內容

sed  -n  'w 2.txt'   1.txt   #將1.txt文件的內容寫入2.txt文件,如果2.txt文件不存在則創建,如果2.txt存在則覆蓋之前的內容

sed   -n '2w  2.txt'   1.txt   #將文件1.txt中的第2行內容寫入到文件2.txt

sed  -n -e '1w  2.txt'  -e '$w 2.txt'   1.txt   #將1.txt的第1行和最後一行內容寫入2.txt

sed  -n -e '1w  2.txt'  -e '$w  3.txt'  1.txt   #將1.txt的第1行和最後一行分別寫入2.txt和3.txt

sed  -n  '/abc\|123/w  2.txt'    1.txt   #將1.txt中匹配abc或123的行的內容,寫入到2.txt中

sed  -n '/666/,$w 2.txt'   1.txt   #將1.txt中從匹配666的行到最後一行的內容,寫入到2.txt中

sed  -n  '/xyz/,+2w  2.txt'     1.txt     #將1.txt中從匹配xyz的行及其後2行的內容,寫入到2.txt中

示例9:sed 在shell腳本中的使用

實例1:替換文件中的內容

#!/bin/bash
if [ $# -ne 3 ];then            #判斷參數個數
  echo "Usage:  $0 old-part new-part filename"    #輸出腳本用法
  exit
fi

sed -i "s#$1#$2#"  $3          #將 舊內容進行替換,當$1和$2中包含"/"時,替換指令中的定界符需要更換爲其他符號

實例2:刪除文件中的空白行

#!/bin/bash

if [ ! -f $1 ];then         #判斷參數是否爲文件且存在

   echo "$0 is not a file"

   exit

fi

sed -i "/^$/d"   $1 #將空白行刪除

實例3:格式化文本內容

#!/bin/bash
a='s/^  *>//      #定義一個變量a保存sed指令,'s/^ *>//':表示匹配以0個或多空格開頭緊跟一個'>'號的行,將匹配內容替換
s/\t*//                 #'s/\t*//':表示匹配以0個或多個製表符開頭的行,將匹配內容替換

s/^>//               #'s/^>//' :表示匹配以'>'開頭的行,將匹配內容替換

s/^ *//'               #'s/^ *//':表示匹配以0個或多個空格開頭的行,將匹配內容替換
#echo $a
sed "$a" $1        #對用戶給定的文本文件進行格式化處理

實用腳本:批量更改當前目錄中的文件後綴名:

示例1:

#!/bin/bash
if [ $# -ne 2 ];then               #判斷用戶的輸入,如果參數個數不爲2則打印腳本用法
  echo "Usage:$0 + old-file new-file"
  exit
fi
for i in *$1*                         #對包含用戶給定參數的文件進行遍歷
do
  if [ -f $i ];then
     iname=`basename $i`        #獲取文件名
     newname=`echo $iname | sed -e "s/$1/$2/g"`         #對文件名進行替換並賦值給新的變量
     mv  $iname  $newname          #對文件進行重命名
   fi
done

exit 666

示例2:

#!/bin/bash
read -p "input the old file:" old        #提示用戶輸入要替換的文件後綴
read -p "input the new file:" new
[ -z $old ] || [ -z $new ] && echo "error" && exit      #判斷用戶是否有輸入,如果沒有輸入怎打印error並退出
for file in `ls *.$old`
do
  if [ -f $file ];then
     newfile=${file%$old}                        #對文件進行去尾
     mv $file ${newfile}$new                   #文件重命名
  fi

done

示例3:

#!/bin/bash

if [ $# -ne 2 ];then        #判斷位置變量的個數是是否爲2
   echo "Usage:$0  old-file  new-file"
   exit
fi
for file in `ls`                      #在當前目錄中遍歷文件
do
  if [[ $file =~ $1$ ]];then   #對用戶給出的位置變量$1進行正則匹配,$1$表示匹配以變量$1的值爲結尾的文件
     echo $file                      #將匹配項輸出到屏幕進行確認
     new=${file%$1}             #對文件進行去尾處理,去掉文件後綴保留文件名,並將文件名賦給變量new                  
     mv $file ${new}$2          #將匹配文件重命名爲:文件名+新的後綴名
  fi

done


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章