GREP、SED、AWK、TR、SORT、UNIQ的一些用法

GREP、SED、AWK、TR、SORT、UNIQ的一些用法
一、將當前目錄下(包括子目錄)的以.shell結尾的普通文件全部重命名爲.sh結尾

view plaincopy to clipboardprint?
01.for i in `find ./ -name '*.shell' -type f `; do mv -f $i `echo $i | sed 's/shell$/sh/'`; done   
02.for i in `find ./ -name '*.shell' -type f` ; do (rename shell sh `echo $i`) ; done  
for i in `find ./ -name '*.shell' -type f `; do mv -f $i `echo $i | sed 's/shell$/sh/'`; done
for i in `find ./ -name '*.shell' -type f` ; do (rename shell sh `echo $i`) ; done

 

二、計數、分類彙總、求平均和排序、最大最小值

被操作文件內容(共3列,以空格分配)

2010-12-1 291 239
2010-12-1 163 177
2010-12-1 240 269
2010-12-1 234 252
2010-12-2 159 157
2010-12-2 203 201
2010-12-2 329 357
2010-12-2 296 224
2010-12-2 229 219

統計第一列每個日期出現的次數

view plaincopy to clipboardprint?
01.awk ' {++S[$1]} END {for(a in S) print a, S[a]}' file   
awk ' {++S[$1]} END {for(a in S) print a, S[a]}' file

 

結果如下:

2010-12-1 4
2010-12-2 5

根據第一列日期,對第二列進行分類彙總

view plaincopy to clipboardprint?
01.awk '{a[$1]++;s2[$1]+=$2} END {for (i in a)  print i,s2[i]}' file   
awk '{a[$1]++;s2[$1]+=$2} END {for (i in a)  print i,s2[i]}' file

 

結果如下:

2010-12-1 928
2010-12-2 1216

根據前面二次的結果求其平均值,並且由高到低排序

view plaincopy to clipboardprint?
01.awk '{a[$1]++;s2[$1]+=$3} END {for (i in a)  print i,a[i],s2[i],s2[i]/a[i]}' ttt \   
02. | sort -r  -n -t ' ' -k 4  
awk '{a[$1]++;s2[$1]+=$3} END {for (i in a)  print i,a[i],s2[i],s2[i]/a[i]}' ttt \
 | sort -r  -n -t ' ' -k 4

結果如下:

2009-4-3 5 1216 243.2
2009-4-2 4 928 232

分類求最大值和最小值

被操作文件內容:

2009-11-01 291
2009-11-01 163
2009-11-01 240
2009-11-01 234
2009-11-02 159
2009-11-02 203
2009-11-02 329
2009-11-02 296
2009-11-02 229
2009-11-03 -39
2009-11-03 -426
2009-11-03 -139

view plaincopy to clipboardprint?
01.awk '{if (max2[$1]=="") { max2[$1]=$2 } if (min2[$1]=="") { min2[$1]=$2 } \   
02.a[$1]++;max2[$1]=($2>max2[$1]?$2:max2[$1]);min2[$1]=($2<min2[$1]?$2:min2[$1])} END \   
03. {printf "%10s\t%6s\t%6s\n","當天的日期","最大值","最小值" ; \   
04.for (i in a) printf "%10s\t%6s\t%6s\n",i,max2[i],min2[i]}' file  
awk '{if (max2[$1]=="") { max2[$1]=$2 } if (min2[$1]=="") { min2[$1]=$2 } \
a[$1]++;max2[$1]=($2>max2[$1]?$2:max2[$1]);min2[$1]=($2<min2[$1]?$2:min2[$1])} END \
 {printf "%10s\t%6s\t%6s\n","當天的日期","最大值","最小值" ; \
for (i in a) printf "%10s\t%6s\t%6s\n",i,max2[i],min2[i]}' file

結果如下:



三、將行首首次出現22的所在行的行號和第二個字段內容顯示出來(分隔符爲:,二種方法)

被操作文件內容

11:dfs:bcd
112234324234:dsfsdf:234
112432423423:sdf:94234
11234:sdf:bbbb
222222:abcd:dfsd
2234234:dfd:fdf
2234343:dfsf:324
331:sdfdsf:bcdfd
332:asfds:dfdsf
3333333333:sfddsf:dsfsdfsd
33435:dsfsdf:sfdsf
44::234
4456:sdfds:dsf

view plaincopy to clipboardprint?
01.grep -n ^22 file | head -n 1 | cut -d ':' -f 1,3   
02.grep -n ^22 file | head -n 1 | awk 'BEGIN {FS=":"} {print $1 ":" $3}'   
grep -n ^22 file | head -n 1 | cut -d ':' -f 1,3
grep -n ^22 file | head -n 1 | awk 'BEGIN {FS=":"} {print $1 ":" $3}'

 

結果如下:

5:abcd

四、將首次出現“222”到再次出現“222”之間的內容顯示出來

被操作文件內容

11
112234324234
112432423423
11234
222222
2234234
2234343
331
2222
332
3333333333
33435
44
4456

view plaincopy to clipboardprint?
01.awk '/222/{print;while(getline line){if(line ~ /222/){break};print line}}' file  
awk '/222/{print;while(getline line){if(line ~ /222/){break};print line}}' file

結果如下:

222222
2234234
2234343
331

五、顯示指定行(第一次在行首出現222的行)到首行或末行之間的內容

被操作文件內容

11
112234324234
112432423423
11234
222222
2234234
2234343
331
2222
332
3333333333
33435
44
4456

 
view plaincopy to clipboardprint?
01.awk 'NR==1 {print;while(getline line){if(line ~ /222/){break};print line}}' file   
02.awk '/222/{while(getline line) print line}' file  
awk 'NR==1 {print;while(getline line){if(line ~ /222/){break};print line}}' file
awk '/222/{while(getline line) print line}' file

二個命令的操作結果分別如下:

11
112234324234
112432423423
11234

2234234
2234343
331
2222
332
3333333333
33435
44
4456

六、查找在韋伯時間之前且是後臺開發的人員名字

a文件

10月13日 12:00 張三
10月15日 12:30 韓七
9月1日 1:3 王二
10月14日 12:30 馬五
1月12日 11:3 王四
10月14日 12:00 李四
10月14日 13:30 韋伯

b文件
韓七 後臺開發  
張三 後臺開發  
王六 遊戲開發  
李四 後臺開發  
馬五 客戶端開發  
韋伯 後臺開發  
陳八 遊戲開發
王二 後臺開發
王四 遊戲開發

 
view plaincopy to clipboardprint?
01.for i in `sort -n a | \   
02.awk 'NR==1 {print;while(getline line){if(line ~ /韋伯/){break};print line}}'  | \   
03.awk '{print $3}'` ; do (grep $i b | grep '後臺開發' | cut -d ' ' -f 1) ; done  
for i in `sort -n a | \
awk 'NR==1 {print;while(getline line){if(line ~ /韋伯/){break};print line}}'  | \
awk '{print $3}'` ; do (grep $i b | grep '後臺開發' | cut -d ' ' -f 1) ; done

結果如下:

王二
張三
李四

七、提取電話號碼和郵件地址

提取手機號碼(假定手機號碼爲11個數字)

view plaincopy to clipboardprint?
01.grep -o '\b[0-9]\{11\}\b' file | sort | uniq  
grep -o '\b[0-9]\{11\}\b' file | sort | uniq

提取固定電話號碼(假定由3部分組成,使用-分割,第一部分爲區號,3-5爲數字,第二部分爲7-8位數字的電話號碼,第三部分爲可能存在的分機,1個數字以上)

view plaincopy to clipboardprint?
01.grep -E  -o '\b[0-9]{3,5}-[0-9]{7,8}\b|\b[0-9]{3,5}-[0-9]{7,8}-[0-9]{1,}\b'  file | sort | uniq  
grep -E  -o '\b[0-9]{3,5}-[0-9]{7,8}\b|\b[0-9]{3,5}-[0-9]{7,8}-[0-9]{1,}\b'  file | sort | uniq

提取郵件地址(假定郵件地址首字符範圍在52個大小寫英文字母和10個阿拉伯數字之內,其後字符範圍加上3個字符“-_.”,整個郵件地址被“@”“.”分割爲3部分,每部分至少包含一個字符)

view plaincopy to clipboardprint?
01.grep -o '[a-zA-Z0-9][a-zA-Z0-9_-.]\{0,\}@[a-zA-Z0-9_-.]\{1,\}\.[a-zA-Z0-9_-.]\{1,\}' file | sort | uniq  
grep -o '[a-zA-Z0-9][a-zA-Z0-9_-.]\{0,\}@[a-zA-Z0-9_-.]\{1,\}\.[a-zA-Z0-9_-.]\{1,\}' file | sort | uniq

八、從文件中刪除所有空行的幾種方法

view plaincopy to clipboardprint?
01.cat file | tr -s '\n'  
02.grep -v '^$' file   
03.sed '/^$/d'  file   
04.sed -n '/./p' file   
05.awk '/./ {print}' file   
06.for i in $(cat file);do echo $i;done  
cat file | tr -s '\n'
grep -v '^$' file
sed '/^$/d'  file
sed -n '/./p' file
awk '/./ {print}' file
for i in $(cat file);do echo $i;done
 

將連續空行變爲1行

view plaincopy to clipboardprint?
01.sed -e '/^$/{$!N;/^\n$/D}' file   
02.cat -s file  
sed -e '/^$/{$!N;/^\n$/D}' file
cat -s file

九、找出所有位數一樣的數字 和 將所有數字倒序

被操作文件內容

234
2342
23
234
2342
88
999999
23
555
2394

view plaincopy to clipboardprint?
01.for i in $(seq 0 9); do grep "^$i\{2,\}" file; done  
for i in $(seq 0 9); do grep "^$i\{2,\}" file; done  

結果如下:

555
88
999999

view plaincopy to clipboardprint?
01.for i in `cat file` ; do  echo $i | rev ; done  
for i in `cat file` ; do  echo $i | rev ; done

結果如下:

432
2432
32
432
2432
88
999999
32
555
4932

十、拓撲排序

被操作文件內容

t3 z2 u4
u4 b7
a3 z2
u9 x5 t3 t6 c6
c6 u4
b7 c4
x5 t6

以空格爲分隔符,每一個均代表一個文件,第一個文件依賴於後面的一個或者多個文件,需要對這些文件進行排序,被依賴的排在前面,比如在
t3 z2 u4
u4 b7
排序可以是
b7
z2
u4
t3

只要保證z2、u4在t3前面,b7在u4前面

view plaincopy to clipboardprint?
01.cat file | while read i j ; do for j2 in $j ; do echo $i $j2 ; done ; done | tsort  | tac  
cat file | while read i j ; do for j2 in $j ; do echo $i $j2 ; done ; done | tsort  | tac

結果是

c4
b7
t6
z2
u4
x5
t3
c6
u9
a3

注:第一個管道後的循環是將原來可能的在同一行上依賴多個文件變成一行只依賴一個,即

t3 z2 u4

變成

t3 z2

t3 u4

十一、合併sql語句

被操作文件內容

[2005/02/18 13:44:23 B0099S05] SELECT a,
|| b,
|| from dual;
[2005/02/18 13:44:23 B0099S05] UPDATE MATERIAL T
|| SET T.CDELDATE = '20050216'
aa ||fsdfs
[2005/02/18 13:44:23 B0099S05] DELETE * from MATERIAL;
aaaaaaaaaaa
|| bbbbbbbbbb
[2005/02/18 13:44:23 B0099S06] SELECT * from MATERIAL LIMIT 1;
|| bbbbbbbbbb
PL/SQL over!。

如果某一行包含字符串‘B0099S05’,則搜索下面所有行首中包含‘||’的連續行,將‘||’刪除,本行與上一行拼接。

view plaincopy to clipboardprint?
01.sed -e ':a;/B0099S05/{N;s/\n||//};ta;P;D' file  
sed -e ':a;/B0099S05/{N;s/\n||//};ta;P;D' file

首先定義了一個命名爲a的標籤,然後去逐行搜索‘B0099S05’,如果找到,再在下一行(N的作用)進行替換(將換行符和||刪除掉),如果成功執行替換,則跳轉到標籤a處繼續執行(ta的作用),P和D的作用如下:

P  打印當前模式空間中第一行。
D  刪除當前模式空間中第一行。開始新的循環,但是如果在模式空間中仍然有數據,那麼跳過讀取輸入。

執行結果如下:

[2005/02/18 13:44:23 B0099S05] SELECT a, b, from dual;
[2005/02/18 13:44:23 B0099S05] UPDATE MATERIAL T  SET T.CDELDATE = '20050216'
aa ||fsdfs
[2005/02/18 13:44:23 B0099S05] DELETE * from MATERIAL;
aaaaaaaaaaa
|| bbbbbbbbbb
[2005/02/18 13:44:23 B0099S06] SELECT * from MATERIAL LIMIT 1;
|| bbbbbbbbbb
PL/SQL over!。

十二、貨幣輸出

view plaincopy to clipboardprint?
01.echo 1234567890 | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta;s/^/¥\ /'   
echo 1234567890 | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta;s/^/¥\ /'  

執行結果:

¥ 1,234,567,890

十三、循環替換字符串

view plaincopy to clipboardprint?
01.sed -i "s/abc/def/g" `grep 'abcdef' -rl .`  
sed -i "s/abc/def/g" `grep 'abcdef' -rl .`

在當前目錄及其子目錄下搜索含有“abcdef”的文件,並將其中的abc替換成def。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章