Linux文本處理工具使用
文件查看工具的使用
cat 命令的使用
此命令一般用于查看文件內容比較多
NAME cat - concatenate files and print on the standard output # 鏈接文件并且以標準輸出打印顯示 SYNOPSIS cat [OPTION]... [FILE]...
-n 顯示加行號
-b 加行號并忽略空行的計算
-s 忽略相鄰的重復的空行(壓縮空行為一行)
-v 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
-T 能看到tab出來的空格,顯示為^I
-A 顯示所有等于-vET
-E 顯示結束符號$
tac 命令的使用
此命令使用方法跟cat一樣,輸出內容跟cat相反
NAME tac - concatenate and print files in reverse #鏈接文件并且以相反方向顯示 SYNOPSIS tac [OPTION]... [FILE]...
rev 命令的使用
此命令把所有字符相反排序顯示
NAME rev - reverse lines of a file or files # 反向顯示文件的行內容 SYNOPSIS rev [file ...]
more 命令的使用
NAME more - file perusal filter for crt viewing # 分頁查看文件內容 SYNOPSIS more [file ...]
-d: 顯示翻頁及退出提示
less 命令的使用
一頁一頁地查看文件或STDIN輸出
NAME less - opposite of more
當我們使用man命令查看文件幫助的時候,實際上就是調用less進程去查看幫助文件
查看時有用的命令包括:
/文本搜索文本(此時從文本當前位置向下搜索)
?文本搜索文本 (此時從文本當前位置向上搜索)
當使用搜索功能的時候,可使用小寫n跳到下一個,大寫N跳到上一個匹配
head 命令的使用
NAME head - output the first part of files # 輸出顯示文件的首部內容 SYNOPSIS head [OPTION]... [FILE]...
-c #: 指定獲取前#字節
-n #: 指定獲取前#行
-#:指定行數
當我們只需要查看某文件的前5行內容的時候,可以使用此命令只查看文件的前5行的內容
tail 命令的使用
NAME tail - output the last part of files # 從文件的尾部查看內容 SYNOPSIS tail [OPTION]... [FILE]...
-c #: 指定獲取后#字節
-n #: 指定獲取后#行
-#:指定獲取后#行
-f: 跟蹤顯示文件新追加的內容,常用日志監控
cut 命令的使用
根據指定的分隔符切片,并顯示出需要顯示的片
NAME cut - remove sections from each line of files # 從文件里面移除選擇的內容 SYNOPSIS cut OPTION... [FILE]...
-d字符:指定分隔符,默認tab
-f數字:指定要顯示的字段
#: 第#個字段
#,#[,#]:離散的多個字段,例如1,3,6
#-#:連續的多個字段, 例如1-6
混合使用:1-3,7
-c按字符切割
–output-delimiter=STRING指定輸出分隔符
指定查看以:為分隔符查看文件的第1,3,7的選項
paste 命令的使用
NAME paste - merge lines of files # 合并多個文件同行號的列到一行 SYNOPSIS paste [OPTION]... [FILE]...
-d 分隔符:指定分隔符,默認用TAB
-s : 所有行合成一行顯示
分析文本的工具的使用
wc 命令的使用
計數單詞總數、行總數、字節總數和字符總數
NAME wc - print newline, word, and byte counts for each file # 統計文件顯示的行數、單詞數和字節數 SYNOPSIS wc [OPTION]... [FILE]... wc [OPTION]... --files0-from=F
-l來 只計數行數
-w來 只計數單詞總數
-c來 只計數字節總數
-m來 只計數字符總數
4 行(文件行數) 9 單詞(文件單詞數) 33 字節(文件大小) /etc/issue (文件名)
sort 命令的使用
把整理過的文本顯示在STDOUT,不改變原始文件
NAME sort - sort lines of text files #對文本文件進行排序 SYNOPSIS sort [OPTION]... [FILE]...
-r 執行反方向(由上至下)整理
-n 執行按數字大小整理
-f 選項忽略(fold)字符串中的字符大小寫
-u 選項(獨特,unique)刪除輸出中的重復行
-t 指定分隔符做為字段界定符
-k數字 指定分隔后進行比較字段
-n 對一堆不規則的數字進行排序,-u 并且刪除重復項
uniq 命令的使用
從輸入中刪除重復的前后相接的行
NAME uniq - report or omit repeated lines # 忽略重復的行 SYNOPSIS uniq [OPTION]... [INPUT [OUTPUT]]
-c: 統計每一行出現的次數(靠著的行)
-d: 僅顯示重復過的行
-u: 僅顯示不曾重復的行
連續且完全相同方為重復
對已經排序的文件進行重復次數的統計,此命令通常跟sort一起用:
sort filelist.txt | uniq-c
diff 命令的使用
比較兩個文件之間的區別
NAME diff - compare files line by line # 比較文件之間的區別 SYNOPSIS diff [OPTION]... FILES
-u 選項來輸出“統一的(unified)”diff格式文件,最適用于補丁文件
diff的結果第六行和第七行多了一個0出來,看下圖cat的結果,跟出來的結果是一樣的。
patch 命令的使用
命令復制在其它文件中進行的改變(要謹慎使用!)
NAME patch - apply a diff file to an original # 變化文件應用到原始文件 SYNOPSIS patch [options] [originalfile [patchfile]]
-b 選項來自動備份改變了的文件
修改文件變化的部分(打補?。?/p>
Linux文本處理三劍客之grep以及正則表達式的使用
grep、egrep、fgrep
NAME grep, egrep, fgrep - print lines matching a pattern # 顯示匹配到的信息 SYNOPSIS grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
grep(Global search REgularexpression and Print out the line.)
作用:文本搜索工具,根據用戶指定的文本模式對目標文件進行逐行搜索,并顯示匹配的行
模式:由正則表達式字符及文本字符所編寫的過濾條件
–color=auto: 對匹配到的文本著色顯示;
-v: 顯示不能夠被pattern匹配到的行;
-i: 忽略字符大小寫
-n:顯示匹配的行號
-c: 統計匹配的行數
-o: 僅顯示匹配到的字符串;
-q: 靜默模式,不輸出任何信息,相當于 &> /dev/null,因為不是任何命令都有靜默模式
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:實現多個選項間的邏輯or關系
grep –e ‘cat ’ -e ‘dog’ file
-w:整行匹配整個單詞
-E:使用擴展正則表達式,grep -E = egrep
注意,CentOS 7默認的grep是個別名
選項例子
匹配/etc/passwd里面含root字符信息的文字,忽略大小寫,并且顯示其前后3行的內容,顯示行號
關于grep對各類引用的應用例子
grep root /etc/passwd (匹配文件中包含“root”字符的信息)
grep "$USER" /etc/passwd (匹配變量$USER信息里面含有的“root”字符信息,""號是弱引用)
grep '$USER' /etc/passwd (匹配“$USER”字符的信息,因為''是強引用,變量不會在執行的時候發生改變,所以沒有匹配到任何的信息)
grep `whoami` /etc/passwd (匹配命令whoami輸出的字符信息,因為“是命令引用,所以匹配的是whoami輸出的信息)
正則表達式
REGEXP(正則表達式):由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能。
程序支持:grep, vim, less,nginx等
正則表達式分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E, egrep
正則表達式引擎:
采用不同算法,檢查處理正則表達式的軟件模塊 PCRE(Perl Compatible Regular Expressions)
幫助手冊查詢 man 7 regex
元字符分類:字符匹配、匹配次數、位置錨定、分組
基本正則表達式元字符
字符匹配:
. :匹配任意單個字符;
[] :匹配指定范圍內的任意單個字符
[^] :匹配指定范圍外的任意單個字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
正則表達式字符匹配例子:
匹配任意兩個字符,后面跟著abc其中一個字符,后面再跟著一個非數字的字符
分析:haaa , ..(ha),[abc](a),[^[:digit:]](a),符合
hab3 , ..(ha),[abc](b),[^[:digit:]](3)錯,不符合
12c3 , ..(12),[abc](c),[^[:digit:]](3)錯,不符號
12aa , ..(12),[abc](a),[^[:digit:]](a),符號
匹配次數:用在要指定次數的字符后面,用于指定前面的字符要出現的次數
*:匹配前面的字符任意次,包括0次
貪婪模式:盡可能長的匹配
.*:任意長度的任意字符
\?:匹配其前面的字符0或1次
\+:匹配其前面的字符至少1次
\{n\}:匹配前面的字符n次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{,n\}:匹配前面的字符至多n次
\{n,\}:匹配前面的字符至少n次
正則表達式匹配次數例子:
匹配開頭h至少1次,匹配i零次或1次,匹配123至少1次,至多3次
分析:hhhi123 ,h\+ (hhh),i\? (i),123\{1,3\} (123)。符合
hi123123123 , h\+ (h) , i\? (i),123\{1,3\}(123123123123)一共有4個,所以只取第一個?(這里有個疑問,這個應該是貪婪模式?) 前半部分符合要求
h123 , h\+ (h),i\? (此處為空,符合), 123\{1,3\} (123) ,符合
i123 , h\+ (此處為空,不符合),i\? (i) , 123\{1,3\} (123)
hii23 ,h\+ (h) , i\? (ii,多了一個i,不符合) ,123\{1,3\} (23,少了1,不符合)
位置錨定:定位出現的位置
^:行首錨定,用于模式的最左側
$:行尾錨定,用于模式的最右側
^PATTERN$: 用于模式匹配整行
^$: 空行
^[[:space:]]*$ :空白行
\< 或\b:詞首錨定,用于單詞模式的左側
\> 或\b:詞尾錨定;用于單詞模式的右側
\<PATTERN\>:匹配整個單詞
正則表達式位置錨定的例子:
先舉個反例子,假如要求我們要匹配root的賬號,在沒有錨定位置的情況下,由于operator賬號里帶有root的信息,所以一并匹配了出來。
假如我們只想匹配root賬號的信息,其他信息不顯示出來:用^號錨定行首,\>字符錨定單詞結尾,這個意思就是以root為行首,且以root為單詞結尾,匹配出來這樣的信息,就只有一個root賬號了。
分組:\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理,如:\(root\)\+
分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, …
\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
實例:\(string1\+\(string2\)*\)
\1: string1\+\(string2\)*
\2: string2
后向引用:引用前面的分組括號中的模式所匹配字符(而非模式本身)
正則表達式位置錨定的例子:
例一: \1 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符,如下圖,即
\1: 匹配“abc123.”,后面的\{2\}即前面的信息“\1”重復2次,所以第一條信息,最后少了一個“.”,不符合要求,第二條信息“abc123.abc123.abc123.”剛好重復了兩次,符號要求。
例二: \2 從左側起,第二個左括號以及與之匹配右括號之間的模式所匹配到的字符,如下圖,即
\2: 匹配“123”,后面的\{2\}即前面的信息“\2”重復2次,所以第一條信息,符合;第二條信息,123只重復了1次,不符合;第三條信息,123重復了3遍,所以只匹配前面符合要求的部分。
元字符部分整理
egrep及擴展的正則表達式
egrep
NAME grep, egrep, fgrep - print lines matching a pattern # 顯示匹配到的信息 SYNOPSIS grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
用法: egrep = grep -E
選項內容和用用法跟grep是一樣的,只是支持擴展的正則表達式的表示方式稍微有所不同,但是思想都是一樣的。
擴展正則表達式元字符
字符匹配:
. 任意單個字符
[] 指定范圍的字符
[^] 不在指定范圍的字符
擴展正則表達式字符匹配的例子:
這個跟基本正則表達式的方式完全沒有改變,此例子跟上面的基本正則表達式一樣,就不再詳述意義。
次數匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
擴展正則表達式次數匹配的例子:
匹配開頭h至少1次,匹配i零次或1次,匹配123至少1次,至多3次
分析:hhhi123 ,h+ (hhh),i? (i),123{1,3} (123)。符合
hi123123123 , h+ (h) , i? (i),123{1,3}(123123123123)一共有4個,所以只取第一個?(這里有個疑問,這個應該是貪婪模式?) 前半部分符合要求
h123 , h+ (h),i? (此處為空,符合), 123{1,3} (123) ,符合
i123 , h+ (此處為空,不符合),i? (i) , 123{1,3} (123)
hii23 ,h+ (h) , i? (ii,多了一個i,不符合),123{1,3} (23,少了一個1,不符合)
可以看見,對于次數匹配的擴展正則表達式的跟基本正則表達式比起來,主要就是少了轉義符號\。這樣看上去的話更加簡潔了。
位置錨定:
^ :行首
$ :行尾
\<, \b :語首
\>, \b :語尾
擴展正則表達式位置錨定的例子:
這個跟基本正則表達式的方式完全沒有改變,這里也不再詳述
分組:
():將一個或多個字符捆綁在一起,當作一個整體進行處理,如:(root)\1
分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, …
\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
實例:(string1+(string2)*)
\1: string1+(string2)*
\2: string2
后向引用:引用前面的分組括號中的模式所匹配字符(而非模式本身)
()
后向引用:\1, \2, …
擴展正則表達式分組的例子:
例一: \1 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符,如下圖,即
\1: 匹配“abc123.”,后面的{2}即前面的信息“\1”重復2次,所以第一條信息,最后少了一個“.”,不符合要求,第二條信息“abc123.abc123.abc123.”剛好重復了兩次,符號要求。
例二: \2 從左側起,第二個左括號以及與之匹配右括號之間的模式所匹配到的字符,如下圖,即
\2: 匹配“123”,后面的{2}即前面的信息“\2”重復2次,所以第一條信息,符合;第二條信息,123只重復了1次,不符合;第三條信息,123重復了3遍,所以只匹配前面符合要求的部分。
以上的例子跟基本正則式的要求是一樣的,可以看見,對于分組的擴展正則表達式的跟基本正則表達式比起來,主要就是少了轉義符號\。這樣看上去的話更加簡潔了。
或者:
a|b
C|cat: C或cat
(C|c)at:Cat或cat
這個是基本正則表達式也有的:
擴展正則表達式或者的例子:
可以看見,對于或者的擴展正則表達式的跟基本正則表達式比起來,主要就是少了轉義符號\。這樣看上去的話更加簡潔了。
總結了一下,其實基本正則表達式功能跟擴展正則表達式功能上基本都一樣,只是有時候需要表達的信息的方法稍微有一點不一樣,正則表達式在實際使用中還是很復雜,例子里面都是一些比較簡單的例子,要能做到快速看明白和熟練使用正則表達式,需要多多練習。
原創文章,作者:~微風~,如若轉載,請注明出處:http://www.www58058.com/29762