Shell-4-讓文本飛
阿新 • • 發佈:2017-08-04
lac logs 指定 filename %d placement ash 正則 創建
1.正則表達式
^ |
行起始標誌 |
$ |
行尾標記 |
. |
匹配任意一個字符 |
[ ] |
匹配包含在[字符]之中的任意一個字符,coo[kl]匹配cook或cool |
[^] |
匹配除[^字符]的任意一個字符 |
[-] |
匹配[]中範圍內任意一個字符 |
? |
匹配之前的項一次或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 test211 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’ file (2)在默認情況下,sed只會打印替換後的文本,要想保留同時更改,用-i選項 sed -i ‘s/pattern/replace_string’ file (3)如果想替換所有內容,在結尾加上參數g sed ‘s/pattern/replace_string/g’ file (4)移除空白行 sed ‘ /^$/d’ file (5)直接在文件中進行替換 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-讓文本飛