1. 程式人生 > >Shell-4-讓文本飛

Shell-4-讓文本飛

lac logs 指定 filename %d placement ash 正則 創建

1.正則表達式

^

行起始標誌

$

行尾標記

.

匹配任意一個字符

[ ]

匹配包含在[字符]之中的任意一個字符,coo[kl]匹配cookcool

[^]

匹配除[^字符]的任意一個字符

[-]

匹配[]中範圍內任意一個字符

?

匹配之前的項一次或0

+

匹配之前的項一次或多次

*

匹配之前的項0次或多次

()

創建一個用於匹配的子串

{n}

匹配之前的項n

{n,m}

指定之前的項所必須匹配的最小次數和最大次數

|

交替-匹配|兩邊的任意一項

\

轉義符可以將上面的符號轉義

2.grep

(1)搜索包含特定模式的文本行

[[email protected] tmp]# cat 1.txt 
this is a test2
11
44
33
55
55
[[email protected] tmp]# grep 3 1.txt 
33
也可以對多個文件進行搜索:grep 3 1.txt 2.txt 3.txt
使用正則表達式必須使用egrep

(2)要打印除某行之外所有行

[[email protected] tmp]# grep -v 3 1.txt 
this is a test2
11 44 55 55

(3)統計文本或文本中包含匹配字符串的行數

[[email protected] tmp]# grep -c 3 1.txt 
1

(4)打印包含匹配字符串的行數

[[email protected] tmp]# grep 3 -n 1.txt 
4:33

(5)搜索多個文件並找出匹配文本位於哪個文件中

[[email protected] tmp]# grep -l 3 1.txt 2.txt 
1.txt
2.txt

(6)如果進行遞歸查詢,可以使用

grep “text” . -R -n

(7)忽視樣式中的大小寫(grep -i pattern file)

(8)用grep匹配多個樣式

grep -e “pattern1” -e “pattern2”

(9)在grep搜索中指定或排除文件

grep “main()” . -r --exclude “readne”

(10)打印出匹配文本之前或之後的行

要打印匹配某個結果之後的3行,可以使用-A選項

[[email protected] tmp]# seq 10|grep 5 -A 3
5
6
7
8

要打印匹配某個結果之前的3行,可以使用-B選項

[[email protected] tmp]# seq 10|grep 5 -B 3
2
3
4
5
要打印匹配某個結果之前以及之後的3行,使用-C選項
[[email protected] tmp]# seq 10|grep 5 -C 3
2
3
4
5
6
7
8

3.用cut按列切分文本

cut -f 2,3 filename

4.sed

1)sed可以替換給定文本中的字符串
  sed ‘s/pattern/replace_string’ file2)在默認情況下,sed只會打印替換後的文本,要想保留同時更改,用-i選項
sed -i ‘s/pattern/replace_string’ file3)如果想替換所有內容,在結尾加上參數g
sed ‘s/pattern/replace_string/g’ file4)移除空白行
sed ‘ /^$/d’ file5)直接在文件中進行替換
sed ‘s/PATTERN/replacement’ -i filename(6)組合多個表達式
sed ‘expression’ | sed ‘expression’
=sed ‘expression;expression’
=sed -e ‘expression’ -e ‘expression’

5.awk

腳本基本結構如下所示:
awk ‘BEGIN{ print “start” } pattern {commands} END{print “end” } ’ file
awk ‘BEGIN {statements} {statements} END { end statements}’

6.統計特定文件中的詞頻

#!/bin/bash
#用途:計算文件中單詞的詞頻

if [ $# -ne 1 ];
then
  echo "usage:$0 filename";
  exit -1
fi

filename=$1

egrep -o "\b[[:alpha:]]+\b" $filename | 
awk { count[$0]++ }
END{ printf("%-14s%s\n","word","count");
for(ind in count)
{ printf("%-14s%d\n",ind,count[ind]) ; }
}~      
 [[email protected] shell]# sh word_freq.sh /tmp/1.txt 
word          count
a             1
this          1
is            1

7.按列合並多個文件(paste)

[[email protected] tmp]# paste 1.txt 2.txt 
this is a test2    cairui
11    xijinpng
44    aiyinsitan
33    
55    
55    

8.打印文件或行中的第n個單詞或列

下面打印第5列
awk ‘{ print $5 }’ filename

9.打印行或樣式之間的文本

(1)[[email protected] tmp]# seq 100|awk ‘NR==4,NR==8‘

(2)4awk ‘NR==M,NR==N’ filename

5

6

7

8

Shell-4-讓文本飛