文本處理工具
抽取文本的工具
文件內容:less和cat
文件截取:head和tail
按列抽?。篶ut
按關鍵字抽取:grep
文件查看命令:cat,tac,rev
cat [選項] [file]
cat -n 對顯示出的每一行進行編號
cat -b 非空行編號
cat -ns 連續壓縮空行成一行
cat -v 顯示回車符
cat -E 顯示行結束符$
cat -A 顯示所有控制符
tac file 反向顯示內容
rev file 反向顯示每一行
hexdump -C file 二進制字符顯示內容
分頁查看文件內容
more [選項] [file]
more -d 顯示翻頁及退出提示
less 一頁一頁的查看文件
/字符 搜索關鍵字符
n/N 跳到下一個或者上一個
less 命令是man 命令使用的分頁器
顯示文本的前行或者后行內容
head [選項] [file]
head -c 數字 指定獲取文件前部分自定義數字的字節
head -n 數字 指定獲取文件前部分自定義數字的行
head -數字 指定獲取文件前部分自定義數字的行數
tail [選項] [file]
tail -c 數字 指定獲取文件后部分自定義數字的字節
tail -n 數字 指定獲取文件后部分自定義數字的行
tail -數字 指定獲取行數后部分自定義數字的行數
tail -f /dir/dir
查看日志的狀態
tail -n 0 -f /var/log/messages &
后臺運行,監測日志的最新內容,直接顯示終端上面,不影響正常工作
按列抽取文本cut和文件paste
cut [選項] [file]
cut -d: -f 1,2,3
-d指明分隔符比如以:為分隔符 默認tab
-f后面跟數字。顯示某個數字的字段
多個字段,例如#,#[,#] 例如1,3,6
連續的多個字段,例如#-# 例如1-6
也可以混合使用,例如1-5,7
cut -c數字范圍按字符切割;例如 cut -c55-56 file
–output-delimiter=指定輸出分隔符 顯示自定義分隔字符)
例如 cut -d: -f1-5 –output-delimiter=+ f1
練習
1找出ifconfig 命令結果中本機的ip地址
~]# ifconfig | head -2 | tail -1 | cut -d: -f2 |cut -d" " -f1
(命令)(管道接口|只顯示前2行的內容,管道接口|顯示后1行的內容,
管道接口|抽取以:為分隔符-f2字段的內容單獨顯示;
管道接口|抽取以“空格字符”為分隔符-f1字段的內容單獨顯示)
2查出分區空間使用率的百分比值
~]# df |tail -5|tr ' ' ':'|tr -s ':'|cut -d: -f5
(命令)(管道接口|只顯示文件的后5行內容;管道接口|用tr命令將文件內容中的'空格'替換成':'
管道接口|用tr -s將連續重復的字符統一壓縮成一個字符;管道接口|抽取文件中以:為分隔符-f5第五個字段的內容顯示)
paste 合并兩個文件同行號的列到一行
paste [選項] [file]
paste -d 指定分隔符 例如 ~]# paste -d: f3 f4
paste -s 所有行合成一行顯示 例如 ~]# paste -s f3 f4
paste file file 格式 例如 ~]# paste f3 f4
分析文本的工具
文本數據統計:wc
整理文本:sort
比較文件: diff 和 patch
收集文本統計數據wc
計數單詞總數、總行數、字節的總數和字符的總數
]# wc f1
18 79 883 f1
行數;單詞數;字符數; 文件
wc -l 只計數行數
wc -w 計數單詞總數
wc -c 計數字節總數
wc -m 計數字符總數
文本排序sort
把整理過的文本顯示出來,不改變原始文件
sort [選項] file
常用選項
sort -r 執行反方向(由上至下)的整理顯示
sort -n 執行按數字大小整理顯示
sort -f 選項忽略(fold)字符串中的字符大小寫
sort -u 刪除多余重復的字符
sort -t 使用某個字符做為字段界定符;比如使用-t:以:作為字段界定符
sort -k 選項按照使用c字符分隔的X列來中立能夠使用多次
uniq 從輸入中刪除重復的前后相接的行
uniq [選項] [file]
uniq -c 顯示每行重復出現的次數
uniq -d 僅顯示重復過的行
uniq -u 僅顯示不曾重復的行
連續并且完全相同方位重復
通常和sort 命令一起配合使用
sort file | uniq -c
比較兩個文件之間的區別
diff [file] [file]
diff f1 f2 > bf.log
比較兩個文件的區別并重定向到一個文件中
復制對文件改變patch
diff 命令的輸出被保存在一種叫做“補丁”的文件中
使用 -u 選項來顯示出來更詳細的變動內容
patch 命令復制在其他文件中進行的改變
使用 -b 選項來自動備份改變了的文件
diff f1 f2 -u > bf.log
patch -b f1 bf.log
先備份f1原有的文件內容,加-b選項后 會生成一個f1.orig的文件格式,這個是原先的f1
然后這個時候bf.log會變成f1文件,也就是恢復了原先的f2文件
練習
1查出用戶UID最大值的用戶名, UID級shell類型
~]# getent passwd |sort -t: -k3 -n |cut -d: -f1,3,7 |tail -1
(命令) (管道接口|-t選項以:為界定符的-k 第3列 -n按照數字大小整理排序)(抽出文本-d:為分隔符的-f 1,3,7字段的內容)(按照倒序1行顯示)
2查出/tmp的權限,以數字方式顯示
~]# stat /tmp | head -4 |tail -1 |tr " " "\n" |head -2 |tail -1 |tr -dc '[:digit:]'
~]# stat /tmp |head -4 |tail -1 |cut -d: -f2 |tr -dc '[:digit:]'
(命令) (正序顯示前4行然后倒序顯示后1行;抽取文本-d:為分隔符 -f 2字段的內容)(刪除在補集引用數字的字符)
文本處理三劍客
grep 文本過濾工具
grep,egrep,fgrep(不支持正則表達式搜索)
sed 文本編輯工具
awk 文本報告生成器
grep
作用:文本搜索功能根據,更具用那個戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行
模式:由正則表達式字符及文本字符所編寫的過濾條件
grep 自定義字符 路徑 路徑
可以搜索指定的字符,可以加上兩個不同的路徑來顯示出來搜索結果
grep [選項] [自定義字符] [file]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami`/etc/passwd
alias grep='grep –color=auto' 對匹配到的文本著色顯示。6版本需要設置,7版本默認
grep -v 顯示不能被自定義字符匹配到的字符串
grep -i 忽略字符大小寫
grep -n 統計匹配的行數
grep -c 統計匹配的行數
grep -o 僅顯示匹配到的字符串
grep -q 靜默模式,不輸出任何信息
grep -A ##自定義數字。后幾行
grep -B ##自定義數字,前幾行
grep -C ##自定義數字,前后各幾行
grep -e 實現邏輯或和與,比如取root或者bash的行 grep -e root -e bash /etc/passwd;
例如,包括root并且bash, grep root /etc/passwd | grep bash
grep -w 整行匹配整個單詞
grep ‘自定義字符’ 默認搜索關鍵字
正則表達式
由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
程序支持:grep,vim,less,nginx等
正則表達式分為兩類
基本正則表達式:BRE
擴展正則表達式: ERE grep -E = egrep
正則表達式引擎:采用不同的算法,檢查處理正則表達式的軟件模塊
元字符分類:字符匹配、匹配次數、位置錨定、分組
基本正則表達式元字符
字符匹配:
. 匹配任意單個字符
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
[:alnum:] 表示所有的字母和數字
[:alpha:] 表示左右的字母不區分大小寫
[:digit:] 表示所有的數字
[:lower:] 表示所有的小寫字母
[:punct:] 表示所有的標點符號
[:space:] 表示所有的空白字符
[:upper:] 表示所有的大寫字母
次數匹配:用于要指定次數的字符后面,用于指定前面的字符要出現的次數
*:匹配前面的字符任意次,包括0次;貪婪模式:盡可能的匹配能匹配多少。
.*:任意長度的任意字符
\?: 匹配其前面的字符0或1次
\+: 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
位置錨定:對特定位置進行定位顯示
^ :行首錨定,用于模式的最左側
$ :行尾錨定,用于模式的最右側
^自定義字符$ :用于匹配到整行
^$ :空行
^[[:space:]]*$ :空白行
\<或\b :詞首錨定,用于單詞模式的左側
\>或\b :詞尾錨定,用于單詞模式的右側
\<自定義字符\> :匹配整個單詞
分組:分組是至將一個或多個字符捆綁在一起,當作一個整體進行處理,其符號為\(\):
如:\(root\)\+
rootrootroot
將三個root分組\(root\) \+表示重復一次以上
分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為:\1,\2,\3,…
\1: 從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\2: 從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
例如 \(ab\+\(xy\)*\)中\1表示 ab\+\(xy\)* \2表示 xy
后向引用:引用錢面的分組括號中的模式所匹配的字符,而非模式本身
egrep及擴展的
正則表達式
egrep = grep -E
egrep [選項] [自定義字符] [file]
擴展正則表達式的元字符:
字符匹配:
. 任意單個字符
[] 指定范圍的字符
[^] 不在指定范圍的字符
次數匹配:
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{m} 匹配m次
{m,n} 至少m,至多n次
位置錨定
^ 行首
$ 行尾
\<,\b 語首
\>,\b 語尾
分組
()
后向引用
\1,\2,…
或者:
a|b
C|cat C或cat
(C|c)at Cat 或cat
擴展正則表達式的使用語法
grep -E '自定義字符' file
egrep '自定義字符' file
練習
1顯示三個用戶root,xiaomage,makangbo的UID和默認shell類型
egrep "^(root|xiaomage|makangbo):" /etc/passwd | cut -d: -f3,7
(擴展正則表達式用“”引用表達式元字符^取開頭為某字符的字段;后面跟文件路徑)
(管道接口|-d抽取分隔符為:的字段 -f 定義第3,7個字段為結果)
2 找出/etc/rc.d/init.d/functions 文件中行首為某單詞(包括下劃線)后面跟一個小括號的行
~]# cat /etc/rc.d/init.d/functions | egrep -o "^[[:alnum:]_]+\(\)"
(查看文件路徑內容;管道接口|擴展正則表達式加-o選項僅顯示匹配到的字符
“”引用^開頭為所有字母和數字,并且帶有下劃線和分組為括號的字段顯為顯示結果)
3使用egrep取出/etc/rc.d/init.d/functions中基名
~]# echo "/etc/rc.d/init.d/functions" | egrep -o "[^/]+?$"
(回顯命令 文件路徑內容 ;管道接口|擴展正則表達式 -o選項僅顯示匹配到的字符
“”引用[^/]匹配知指定范圍外的任意單個字符,+匹配前面的字符至少一次?任意字符$匹配字符結尾)
4 顯示/etc/passwd 文件中不以/bin/bash結尾的行
~]# grep -v /bin/bash$ /etc/passwd
(正則表達式-v選項顯示不能被匹配到的行,不匹配以/bin/bash$為結尾的字符,,后面跟文件路徑)
5 顯示rpc默認的shell程序
~]# grep -w "\<rpc" /etc/passwd |cut -d: -f7
(命令加-w選項,整行匹配整個單詞。引用詞首錨定\<為rpc 后面跟上文件路徑)
(抽取文本-d:為分隔符的 定義-f7的字段內容為顯示結果)
6 找出/etc/passwd 中的兩位或三位數
~]# grep "[0-9][0-9][0-9]\?" /etc/passwd
(命令 引用[數字范圍]\? 匹配前面的字符0次或1次,就是前面的可有可無 后面跟文件路徑)
7顯示 /etc/grub2.cfg 文件中,至少以一個空白字符開頭的,并且后面存在費空白字符的行
~]# grep "^[[:space:]\+[^[:space:]]" /etc/grub2.cfg
(命令引用^開頭為空白字符的\+匹配最少一次[^[非空白結尾的字符行 后面跟文件路徑)
8找出‘netstat -tan’命令結果中以'LISTEN'后跟任意多個空白字符結尾的行
~]# netstat -tan | grep "LISTEN[[:space:]]*$"
(命令 管道接口|正則表達式引用LISTEN之后跟空白字符*匹配任意次$行尾錨定)
9 添加用戶bash,testbash,basher,nologin (shell為/sbin/nologin)而后找出/etc/passwd文件中用戶名同shell的行
~]# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
(命令引用^行首錨定,分組所有字母數字\{1,\}匹配前面的字符至少一次 .*匹配任意長度的任意字符 \1后向引用 $行尾錨定 后面跟文件路徑)
不管什么命令,要學會靈活使用,有的時候搭配在一起會讓人有意想不到的結果,比如 rm -rf /
原創文章,作者:小馬哥,如若轉載,請注明出處:http://www.www58058.com/31336