在linux文件系統中經常會使用到文本處理工具,這里簡單介紹幾種文本處理工具:
抽取文本的工具
文件內容:less和cat
文件截?。篽ead和tail
按列抽?。篶ut
按關鍵字抽?。篻rep , egrep
文件查看命令:cat, tac,rev,more,less
cat命令是用戶經常使用的用來查看文本文件的命令,cat命令是需要接收到標準輸入然后再標準輸出設備上。并且和cat命令相對應的還有tac,tev兩個命令。
語法:cat [OPTION]… [FILE]…
常用選項:
-E: 顯示行結束符$
-n: 對顯示出的每一行進行編號
-A:顯示所有控制符
-b:非空行編號
-s:壓縮連續的空行成一行
cat查看文件是順序查看,標準輸入什么格式就輸出什么格式。而tac命令,從字面上就可以看出它是cat倒過來寫的,使用tac查看文件就會倒敘顯示輸出,即第一行最后顯示,最后一行首先顯示。而rev命令輸出的格式和它們兩個又不一樣,rev命令是將文件中的每行內容以字符為單位反序輸出,即一行之中,第一個字符最后輸出,最后一個字符首先輸出。
使用cat命令查看文件是一下全部顯示,小文件還好,遇到大文件就麻煩了。而more命令顯示一頁后會自動停下,并在地步出現提示信息,顯示當前位置所示全文的百分比。
more: 分頁查看文件
語法:more [OPTIONS…] FILE…
常用選項: -d: 顯示翻頁及退出提示
more命令是一個文件過濾器,它以全屏幕的方式按頁顯示文本文件的內容,支持關鍵字查找。內置若干快捷鍵,常用快捷鍵H (獲取幫助信息),Enter (向下翻一行),空格鍵(向下翻一屏)B(向上翻一屏)Q(退出)
more命令查看大文件很方便,但是也有一個缺點就是不能向上翻頁,只能向前走,沒有回頭路。。。想要回頭查看就需要用到less命令了。
less:一頁一頁地查看文件或STDIN輸出
查看時有用的命令包括:
/文本搜索文本
n/N跳到下一個或上一個匹配
less命令是man命令的命令十分相似,不同的是less命令允許向上翻頁。less命令顯示文件時,用Pageup向上翻頁,使用Pagedown向下翻頁。
顯示文本前或后行內容
有時查看文件這是想查看文件的前幾行或后幾行,并沒有想查看全部。這時就需要用到head和tail命令 。
head命令:意如其名,用于顯示文件的開頭的內容,默認顯示文件的錢10行,也可指定行數。
語法:
head [OPTION]… [FILE]…
常用選項:
-c #: 指定獲取前#字節
-n #: 指定獲取前#行
-#:指定行數
tail命令:顯示文件的后幾行內容,默認是顯示文件的末尾10行。
語法:
tail [OPTION]… [FILE]…
常用選項:
-c #: 指定獲取后#字節
-n #: 指定獲取后#行
-#:指定行數
-f: 跟蹤顯示文件新追加的內容,常用日志監控
按列抽取文本cut和合并文件paste
cut命令:用來顯示文件中指定行中的部分,經常用來切割顯示文件信息。
語法:
cut [OPTION]… [FILE]…
常用選項:
-d DELIMITER: 指明分隔符,默認tab
-f FILEDS:
#: 第#個字段
#,#[,#]:離散的多個字段,例如1,3,6
#-#:連續的多個字段, 例如1-6
混合使用:1-3,7
-c按字符切割
–output-delimiter=STRING指定輸出分隔符
如:顯示系統中所有用戶的UID和shell類型
用戶的UID和shell類型信息都在/etc/passwd文件中。文件是以“:”為分割符。UID和shell類型分別在第3和7列。
paste命令: 合并兩個文件同行號的列到一行
語法:
paste [OPTION]… [FILE]…
常用選項:
-d 分隔符:指定分隔符,默認用TAB
-s : 所有行合成一行顯示
paste f1 f2
paste -s f1 f2
分析文本的工具
文本數據統計:wc
計數單詞總數、行總數、字節總數和字符總數, 可以對文件或STDIN中的數據運行
例:wc story.txt
39 237 1901 story.txt
行數 字數 字符數
常用選項:
使用-l來只計數行數
使用-w來只計數單詞總數
使用-c來只計數字節總數
使用-m來只計數字符總數
整理文本:sort
把整理過的文本顯示在STDOUT,不改變原始文件
語法:sort [options] file(s)
常用選項:
-r執行反方向(由上至下)整理
-n執行按數字大小整理
-f選項忽略(fold)字符串中的字符大小寫
-u選項(獨特,unique)刪除輸出中的重復行
-t c選項使用c做為字段界定符
-k X選項按照使用c字符分隔的X列來整理能夠使用多次
比較文件:diff和patch
比較兩個文件之間的區別
例:
diff foo.conf-broken foo.conf-works
5c5
<use_widgets=no
—
>use_widgets=yes
注明第5行有區別(改變)
diff命令的輸出被保存在一種叫做“補丁”的文件中
使用-u選項來輸出“統一的(unified)”diff格式文件,最適用于補丁文件。
patch命令復制在其它文件中進行的改變(要謹慎使用?。?/span>
適用-b選項來自動備份改變了的文件
$diff -u foo.conf-broken foo.conf-works > foo.patch
$patch -b foo.conf-broken foo.patch
文件排序sort:
sort命令:把整理過的文本顯示在STDOUT,不改變原始文件
語法:sort [options] file(s)
常用選項:
-r執行反方向(由上至下)整理
-n執行按數字大小整理
-f選項忽略(fold)字符串中的字符大小寫
-u選項(獨特,unique)刪除輸出中的重復行
-t c選項使用c做為字段界定符
-k X選項按照使用c字符分隔的X列來整理能夠使用多次
文件整理uniq
uniq命令:從輸入中刪除重復的前后相接的行,一般與sort命令結合使用。(連續且完全相同方為重復)
語法:uniq[OPTION]… [FILE]…
常用選項:
-c: 顯示每行重復出現的次數
-d: 僅顯示重復過的行
-u: 僅顯示不曾重復的行
常和sort 命令一起配合使用:
sort userlist.txt | uniq-c
例:查出用戶UID最大值的用戶名、UID及shell類型
[root@localhost ~]# cut -d: -f1,3,7 /etc/passwd | sort -t: -k2 -n | tail -1
文本過濾工具
: grep,egrep,fgrep
grep:(global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。
作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式字符及文本字符所編寫的過濾條件
語法:grep [OPTIONS] PATTERN [FILE…]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd
常用選項:
–color=auto: 對匹配到的文本著色顯示;
-v: 顯示不能夠被pattern匹配到的行;
-i: 忽略字符大小寫
-n:顯示匹配的行號
-c: 統計匹配的行數
-o: 僅顯示匹配到的字符串;
-q: 靜默模式,不輸出任何信息
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:實現多個選項間的邏輯or關系
grep –e ‘cat ’ -e ‘dog’ file
-w:整行匹配整個單詞
-E:使用ERE
正則表達式:
REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能。
程序支持:grep, vim, less,nginx等
正則表達式分為兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E, egrep
基本正則表達式元字符:
字符匹配:
. : 匹配任意單個字符
[] : 匹配指定范圍內的任意單子字符
[^] :匹配指定范圍外的任意單個字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
匹配次數: 用在要指定其出現的次數的字符的后面,用于限制其前面的字符出現的次數;模式使用貪婪模式;
* : 匹配其前面的字符任意次;0,1,多次
.* :匹配任意長度的任意字符
\? : 匹配其前面的字符0此或1次;即前面的字符是可有可無的
\+ : 匹配其前面的字符1次或多次;即前面的字符出現至少1次
\{m\}:匹配其前面的字符m次
\{m,n\} :匹配其前面的字符至少出現m次,至多n次
\{,n\} :匹配其前面的字符至多n次
\{m,\} :匹配其前面的字符至少m次
位置錨定:
^ : 行首錨定;用于模式的最左側
$ : 行尾錨定;用于模式的最右側
^$:空白行
^PATTERN$:用于PATTERN來匹配整行
單詞:非特殊字符組成的連續字符都稱為單詞
\<或\b:詞首錨定,用于單詞左側
\>或\b:詞尾錨定。用于單詞右側
\<PATTERN\>:精確匹配完整單詞
分組及引用
\(\) :將一個或多個字符捆綁在一起當作一個整體進行處理;\(xy\)*ab
分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為
\1: 從模式左側起,第一個()內所匹配到的字符
\2 :從模式左側起,第二個()內所匹配到的字符
\3:
……
后向引用:引用前面的分組括號中的模式所匹配到的字符(而非模式本身)
例:
1、在/etc/passwd文件中找以root開頭中間也有root的行
2、找出/etc/passwd中的兩位或三位數
[root@localhost ~]# grep "\<[0-9]\{2,3\}" /etc/passwd
egrep及擴展的正則表達式
egrep與grep區別:
egrep為 grep 的擴充版本, 改良了許多傳統 grep 不能或不便的操作. 比方說:
grep 之下不支持 ? 與 + 這兩種 modifier, 但 egrep 則可.
grep 不支持 a|b 或 (abc|xyz) 這類"或一"比對, 但 egrep 則可.
grep 在處理 {n,m} 時, 需用 { 與 } 處理, 但 egrep 則不需.
egrep: 支持擴張的正則表達式實現類似于grep文本過濾功能:grep -E
語法: egrep [OPTIONS] PATTERN [FILE…]
選項和grep相同,-G支持基本正則表達式
擴展正則表達式的元字符
字符匹配:
. : 匹配任意單個字符
[] : 匹配指定范圍內的任意單子字符
[^] :匹配指定范圍外的任意單個字符
次數匹配: 用在要指定其出現的次數的字符的后面,用于限制其前面的字符出現的次數;模式使用貪婪模式;
* : 匹配其前面的字符任意次;0,1,多次
? : 匹配其前面的字符0此或1次;即前面的字符是可有可無的
+ : 匹配其前面的字符1次或多次;即前面的字符出現至少1次
{m}:匹配其前面的字符m次
{m,n} :匹配其前面的字符至少出現m次,至多n次
{0,n} :至多n次
{m,} :至少m次
位置錨定
^ : 行首錨定;用于模式的最左側
$ : 行尾錨定;用于模式的最右側
\<或\b:詞首錨定,用于單詞左側
\>或\b:詞尾錨定。用于單詞右側
分組及引用
() :將一個或多個字符捆綁在一起當作一個整體進行處理;\(xy\)*ab
分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為
\1: 從模式左側起,第一個()內所匹配到的字符
\2 :從模式左側起,第二個()內所匹配到的字符
\3:
……
后向引用:引用前面的分組括號中的模式所匹配到的字符
或:
a | b : a或者b
C | cat : C或者cat
(C|c)cat: Cat或者cat
fgrep:不支持正則表達式元字符
fgrep 命令于 grep 和 egrep 命令不同,因為它搜索字符串而不是搜索匹配表達式的模式。fgrep 命令使用快速的壓縮算法。
當無需要用到元字符編寫模式時,使用fgrep性能更好
例:
1、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@localhost ~]# echo "/etc/rc.d/init.d/functions" | egrep -o "[^/]+/?$"
2、顯示ifconfig命令結果中所有IPv4地址
[root@centos7 ~]# ifconfig | egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
原創文章,作者:Groot,如若轉載,請注明出處:http://www.www58058.com/30084