在前面介紹了linux中重要的幾個文本編輯工具,如vim/vi、nano等等,它們均可以進行文本文件內容的編輯操做,接下來介紹的是文本的處理工具:
linux
主要有grep家族,sed,awk等等,還有一些其餘的處理工具諸如cut sort等等了;做爲文本處理工具的三劍客之一,grep可謂功能強大。grep 全稱是 (Global search REgular expression and Print line)git
做用是:文本搜索工具,根據用戶指定的文本模式(正則表達元字符以及正常字符組合而成)對目標文件進行逐行搜索,顯示能匹配到的行; 正則表達式
模式:由正則表達式的原字符及文本字符所編寫的過濾條件;算法
grep家族裏根據元字符的數量及功能不一樣又分爲基本正則表達式(grep)和拓展正則表達式(egrep)express
用法上有些許的差別,可是也能互通,好比 grep -E 就至關於egrep了vim
注意:grep默認僅支持基本的正則表達式
app
egrep默認僅支持擴展的正則表達式ide
fgrep默認不開啓正則表達式引擎工具
用法格式:grep [options] PATTERN [FILE...]
ui
【經常使用選項】:
-i, --ignore-case
忽略PATTERN 和輸入文件中的大小寫的分別。
-v, --invert-match
改變匹配的意義,只選擇不匹配的行。反向匹配
-c,--count
計數,統計匹配PATTERN
-o, --only-matching
關閉貪婪模式 只顯示匹配的行中與 PATTERN 相匹配的部分。
-q, --quiet, --silent
不輸出任何匹配結果
-E,--extended-regexp:擴展的正則表達式,至關於egrep
-F,--fixed-strings, --fixed-regexp: 至關於fgrep
-G,--basic-regexp: 基本的正則表達式 ,egrep -G = grep
-P,--perl-regexp: 使用PCRE引擎
-A NUM, --after-context=NUM 在顯示匹配PATTERN的行的同時 顯示其後面的NUM行
-B NUM, --before-context=NUM 在顯示匹配PATTERN的行的同時 顯示其前面的NUM行
-C NUM, --before-context=NUM 在顯示匹配PATTERN的行的同時 顯示其前面和後面各NUM行
PATTERN:指的是過濾條件,正則表達式由兩種基本字符類型組成:原義(正常)文本字符和元字符。 文本字符呢,就是表明其自己含義的字符這個不用作太多解釋;
而所謂元字符就是指那些在正則表達式中具備特殊意義的專用字符,不表示其字面意義,而
用於額外功能性描述。這些元字符會被正則表達式的引擎解釋爲特殊含義;
基本的正則表達式元字符:
1.字符匹配:
. : 匹配任意單個字符 grep .x /etc/passwd 只要包含x就做匹配
[] : 匹配指定範圍內的任意單個字符 grep [xhm] /etc/passwd 匹配文件中帶有x或h或m的字段
[^] : 匹配指定範圍外的任意單個字符單個字符
這裏相似於前面提到的Globbing通配字符,例如[[:digit:]]表示的匹配單個數字等等;這裏就不做贅述;
2.次數匹配:該類字符以前的那個字符能夠出現的次數
*:前面的字符能夠出現任意次(0,1或屢次) grep 'x*y' /FILE 文件中y以前出現x的次數不限
\?:前面的字符無關緊要(0或1次) grep 'x\?y' /FILE 文件中y以前的x最多出現1次
\+:前面的字符至少出行1次(1次或屢次) grep 'x\+y' /FILE 文件中y以前的x最少出行1次
\{m\}:前面的字符必須出現m次 grep '\{2\}' /FILE 文件中y以前的x只能出現2次
\{m,n\}:前面的字符出現至少出現m次 至多n次 因此一般來說 m<n
\{,n\}:前面的字符至少出行0次 至多出現n次
\{m,\}:前面的字符至少出現m次,至多不限
在正則表達式中,表示任意長度,任意字符的方式是: .*
grep '.*y' /FILE 文件中y以前不管出現什麼字符都匹配
3.位置錨定字符:
行錨定:
行首錨定:^ grep '^s' /FILE 文件FILE中以s開頭的行
行尾錨定:$ grep 's$' /FILE 文件中以s結尾的行
字錨定:
字首錨定:\< 或者 \b
字尾錨定:\> 或者 \b
grep -o '\<y.*c\>' whj.txt 顯示whj.txt中 y字母開頭c字母結尾的字
\b:舊版本中的錨定方法;
**對於正則表達式的引擎來講,所謂的字是由非特殊字符組成的連續字符串;
4.分組與引用字符:
\(PATTERN\) 將此PATTERN所匹配到的字符看成一個不可分割 的總體來處理
在正則表達式引擎中,有一系列的內置變量,這些變量會保存全部分組內的字符信息,用於後向引 用,這些變量依次是:
\1 \2 \3 ……
例如 在PATTERN1\(PA2\)PA3\(PA4\)... 之中,\1:pattren2 \2:pattern4...
也就是\1表示第一組小括號內的PATTERN匹配到的字符;...以此類推
例:找出在/etc/passwd 中用戶的uid和gid相同的用戶帳戶;
grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd
5.或:
\|
注意:\|將其左右兩邊的字符串看成總體對待;
A\|american : A或amarican
例題
請找出ifconfig的執行結果中,數字在100-255之間的三位數
第一位:1 或者 2
第二位:0-9或者 0-4 或者 5
第三位:0-9或者 0-9 或者 0-5
ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'
找出0-255:
ifconfig | grep '\<\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'
grep [options] [-e PATTERN | -f FILE] [FILE...]
默認狀況下,grep命令後只容許有一個PATTERN,若是想要在一次grep搜索過程當中寫多個PATTERN 須要使用-e選項;每一個-e 只能跟一個PATTERN
或者將所須要的PATTERN寫入到一個文件中保證每行只有一個PATTERN,這樣可使用-f FILE 來實現多PATTERN匹配
egrep:
grep [options] PATTERN [FILE...]
擴展的正則表達式元字符
1.字符匹配
.
[]
[^]
2.次數匹配
*
?
+
{m}
{m,n}
{m,}
{0,n}
3.位置錨定
^
$
\<,\b
\>,\b
4.分組和引用
(pattern)
\1 \2 \3 ...
5.或:
|
以上能夠看出,egrep相比grep 少了不少'\',可是注意位置錨定中的字首字尾錨定不能省略'\'
fgrep
不使用PATTERN搜索引擎,因此 PATTERN全部的字符都被看成文本字符來處理;
其餘的文本處理命令
wc:
wc [opt]... [file]...
-l:只顯示行數
-w:只顯示字數
-c:只顯示字符數
-m:
cut:
把文件某一行的某些字段移除;
可以被cut命令修剪的文件,通常都是具備必定結構或格式的文本文檔:例如/etc/passwd
【OPT】
-d,--delimeter=DELIM
指定在修剪時,所依賴的分隔符 默認 是空白字符
-f,--filed=LIST
根據定義的分隔符來指定字段的編號
地址定界的使用方法:
#:選擇被指定的單個字段
#,#:離散的多個被指定的單個字段
#-#: 連續的多個被指定的字段
--output-delimeter=STRING :指定輸出分隔符
awk:
awk -F "DELIMETER" '[/PATTERN/]{print $1,$2,...$NF}
-F "DE" :指定字段分隔符,默認爲空白字符;
$1 $2...$NF : 根據字段分割符切割出來的文本片斷都存放在相應的內部變量中;
sort:
將文本文件按行排序,默認排序規則是按照ASCII表進行,這個排序標準能夠修改;
-r 逆序排序.
-R 隨機排序,這種隨機算法很是簡單,不適用於複雜環境;
-u 重複出現的行,只保留一行,連續且徹底相同的行纔是重複的行,祛重.
-n 按數值大小進行排序.
-t 指定字段分隔符.
-k 指明根據哪一個關鍵字段進行排序,通常和-t同時使用.
uniq:
-d 只顯示重複出現的行,並且每一組重複的行只顯示一行
-u 只顯示不重複的行
-c 在每行的前面 之前綴的方式顯示重複行的重複次數
diff:比較兩個文件的差別性
同一個文件的不一樣修改版本。打補丁:
patch:apply changes to files
patch [-R][-i patchfile] [file]
例題:
有一個文件a.txt,內容以下:
12 314 56 78
24 56 8 90
76 11 67 87
100 89 78 99
找出文件中的最大和最小值;
最大值:cat a.txt | tr ' ' '\n' | sort -nr | head -1
最小值:cat a.txt | tr ' ' '\n' | sort -n | head -1