Linux入門之常見文本處理工具
文本內容查看命令
cat tac rev more less head tail
普通文本查看 cat tac rev
cat 命令
cat [option] /path/to/file
-E 顯示行結束標示符$
-n 顯示行號
-b 對非空白行顯示行號
-A 顯示所有控制符
-s 壓縮連續空白行為一行
-v 顯示回車符
-T 顯示tab符
[root@mzf ~]# cat -A cut.txt abcABC$ defDEF$
解析:查看文本中包含的特殊符號,在linux中$表示為行結束符
tac 命令 將文本逆向顯示
tac [option] /path/to/file
-r [reg] :匹配正則表達式,其中reg匹配是針對文件名,而非文本內容
[root@mzf ~]# tac cut.txt
defDEF
abcABC
解析:這里的文本顯示就是倒敘排序并顯示文本,如最后一行顯示為第一行
rev 命令 逐行將文本字符逆向排序后顯示
rev /path/to/file
[root@mzf ~]# echo -e "abcdefg\n123456" > rev.txt [root@mzf ~]# cat rev.txt abcdefg 123456 [root@mzf ~]# rev rev.txt gfedcba 654321
解析:這里會逐行對字符進行逆向排序,只是調換索引位置,并沒有任何排序算法
分頁顯示文本 more less
more 分頁查看文件
more [option] /path/to/file
-d 顯示翻頁及退出提示
less 逐頁查看文本或者結束STDIN標準輸入進行分頁查看
less /path/to/file
搜索關鍵字符查找
/string : 按 n鍵向下查找, N鍵向上查找
快捷鍵:
k 下一行 j 上一行
Ctrl+b 上一屏 Ctrl+f 下一屏
注意:在查看中可以使用! [command] 及!后面跟需要執行的命令,可以不退出less而執行顯示命令
解析:這里使用less查看一個文件中內容中,然后使用!ls -l /var/log/messages查看指定文件的屬性信息,但是使用less查看文本中使用!后跟的命令支持度有限,比如date +%F就無法執行成功
按前后行顯示文本
顯示前幾行
head [option] File 默認顯示前10行
-c # :全文中最開始的#個字符
-n # :前#行
-# :指定前#行
[root@mzf ~]# head -c 10 rev.txt #查找全文中前10個字符 abcdefg 12[root@mzf ~]#head -n 1 /etc/passwd #按行查找找前1行 root:x:0:0:root:/root:/bin/bash
顯示當后幾行
tail [option] File 默認顯示后10行
-c # :全文中最后#個字符
-n # :后#行
-# : 后#行
-f : 跟蹤文件變化 (一般用來跟蹤日志)
[root@mzf ~]# cat -n /etc/passwd | tail -n 1 #查詢最后一行重定向數據 60 wang:x:20012:20014::/home/wang:/bin/bash [root@mzf ~]# tail -c 10 /etc/passwd #全文查找最后10個字符 /bin/bash
文本格式處理
cut paste wc sort uniq
按列切割文本 cut命令
cut [option] /path/to/file
-d # :指定分割符
-f 按指定列顯示
-f# 第幾列
-f#,# 顯示指定幾列
-f#-# 顯示從第幾列到第幾列
注意:可以混合顯示,例如 cut -d: -f3,5,6-9
-c # 按字符分割,第幾個字符,格式類似-f
-# 表示第1到#個字符 #- 表示第#到最后一個字符
–output-delimiter=" STRING" 指定輸出分隔符,一般配合 -c 選項使用
[root@mzf ~]# cut -d':' -f1,3 /etc/passwd | tail -n 2 mage:20011 wang:20012
解析:按:符號把文本切成多列,取第1列和第3列
[root@mzf ~]# cat cut.txt abcABC defDEF [root@mzf ~]# cut -c -3,4- --output-delimiter='*' cut.txt abc*ABC def*DEF
解析:截取沒一行第1到3個字符和第4到最后一個字符,然后中間用*隔開
注意:這里-c需要指定兩個范圍參數,否則用輸出分隔符無效
合并兩個文件同行號內容為一行 paste
paste [option] /path/to/file
-d :指定分割符,默認不指定使用tab符
-s :所有行顯示為一行
例如: paste file1 fiel2
[root@mzf ~]# paste -d '*' /etc/passwd /etc/shadow | head -n 1 root:x:0:0:root:/root:/bin/bash*root:$6$vTjvO/Ex$TnsqEvhX7Zeava1t4D.9fSJ1Yt.Nb1iAvUa97nK1Ch/WksYn74mhlFYQKPfMvNGpMpqgwuolXLUaLHukspcH0/:17014:0:99999:7:::
解析:這里把每一行逐行鏈接,可以用用來對于文件來解析2個格式類型的文本文件的內容分析,比如這里可以同時分析root用戶的用戶屬性和密碼屬性
文本統計命令 wc
wc [option] [file]
-l 統計行數
-w 統計單詞數
-m 統計字符數
-c 統計字節數
不指定選項默認顯示格式為:
[root@mzf ~]# wc cut.txt 2 2 14 cut.txt 行數 單詞數 字符數 文件名
注意:因為文本文件的編碼不同,字符數的計算可能也會有所不同
按條件過濾和排序 sort uniq
sort [options] /path/to/file…
-r 執行反方向(由上至下)整理
-n 執行按數字大小整理
-f 選項忽略(fold)字符串中的字符大小寫
-u 選項(獨特,unique)刪除輸出中的重復行
-t # 選項使用#做為字段界定符
-k [n] 選項按照使用#字符分隔的n列來整理能夠使用多次
注意:如果數據中有按指定分割符排出的未到達列數的行,將被過濾為空白行
例如:
uniq 合并重復行
-c 顯示重復次數
-d 只顯示重復的行
-u 只顯示不重復的行
注意:對于不能連續出現的重復行uniq不做處理,而此時可以配合sort將重復行排為連續顯示,再使用uniq來確定最終的重復行數
例如:
[root@mzf ~]# cat test #查看test文本,發現以下三行文本 10.10.10. 10.10.10.10 10.10.10 [root@mzf ~]# sort -t'.' -k4 -nu test #使用.符號作為分隔符以第4列排序,然后使用數字排序過濾重復 10.10.10. 10.10.10.10
解析:這里test文本中只有2行同時存在3個.符號,2行中以.分割的第4列分別為空格、數字,而最后一條只有2個.符號,表示第4列為無,那么加上了-u選項(uniq),就意味著通過.符號劃分出來的列將于空白行歸位一類,壓縮成行空白行而不顯示數據,只有滿足列數分割才會被匹配出來,-u是對與-k指定的列進行重復壓縮,如果此列數據相同,那么其他列不同也會被過濾掉,這時可以指定多個-k選項來多列優先級,比如127.0.0.1和127.0.0.2如果指定-t'.' -k3 那么進入sort排序后只會存排在最前名在一個ip
例如:stort file1 | uniq -c
[root@mzf ~]# cat hello.txt #查看hello.txt文件 aaaaaaaaaaaa bbbbbbbbbbbb dddddddddddd dddddddddddd cccccccccccc dddddddddddd cccccccccccc dddddddddddd aaaaaaaaaaaa [root@mzf ~]# uniq -c hello.txt #發現非連續的重復行無法壓縮為一行 1 aaaaaaaaaaaa 1 1 bbbbbbbbbbbb 1 2 dddddddddddd 1 cccccccccccc 1 dddddddddddd 1 cccccccccccc 1 dddddddddddd 1 aaaaaaaaaaaa [root@mzf ~]# sort hello.txt | uniq -c #這時想使用sort排序把字符相近的行排為連續行,再顯示重復行 2 2 aaaaaaaaaaaa 1 bbbbbbbbbbbb 2 cccccccccccc 4 dddddddddddd
文件更新和文件補丁 diff path
diff 用來比較兩個文件或目錄區別
diff FILE1 FILE2
[root@mzf ~]# cat file1 #查看file1文件 This is a old line This is a old line service network start [root@mzf ~]# cat file2 #查看file2文件 This is a old line This is update newline This is a old line service network stop [root@mzf ~]# diff file1 file2 #逐行分析file1和file2的不同行 2c2 #第2行的不同比較 < --- > This is update newline 4c4 #第4行的不同比較 < service network start --- > service network stop 解析:發現file1和file2
的第二行有區別,file1中第二行是空行,而file2中第二行中
多了一行文字,第4行中兩行數據不完全一樣,也會被列出來
創建補丁文件 diff -u
[root@mzf ~]# diff -u file1 file2 --- file1 2016-08-06 09:34:00.210087098 +0800 +++ file2 2016-08-06 09:34:20.152088276 +0800 @@ -1,4 +1,4 @@ This is a old line - +This is update newline This is a old line -service network start +service network stop
說明:現在輸出的信息就是詳細的文件數據變化條目,比如數據的修改時間,-1,4表示file1文件的第1和4行,而+1,4表示file2文件的第1行和第4行,下面不同的行會連續顯示,這樣可以明確區分文件的不同信息,當然這個信息具有特殊格式,還可以用來更新文件
patch命令:復制在其它文件中進行的改變,一般配合diff使用
創建文件補丁并更新文件
將剛才的補丁格式數據保存至文件 [root@mzf ~]# diff -u file1 file2 > file2.patch #通過重定向將補丁格式數據寫入文件 將文件內容更新為補丁中的指定內容 [root@mzf ~]# patch -b file1 file2.patch #使用patch命令-b來更新file1不同步的數據 patching file file1 [root@mzf ~]# cat file1 #再次查看file1文件,發現和file2數據同步 This is a old line This is update newline This is a old line service network stop [root@mzf ~]# patch -b file2 file2.patch #將file2文件的數據改變為未改變之前的file1數據 patching file file2 Reversed (or previously applied) patch detected! Assume -R? [n] y #這里提示是否重置 [root@mzf ~]# cat file2 #再次讀取file2文件,發現真的還原回來了 This is a old line This is a old line service network start
注意:這里是patch需要配合讀取diff -u創建的指定格式的補丁文件來根據格式判斷改變指定行數據,如果對file2文件使用補丁那么file2也會變成原來的file1文件數據,這里就發現了補丁文件的強大之處
練習:
1、找出ifconfig命令結果中本機的所有IPv4地址
[root@mzf ~]# ifconfig | tr -cs '[0-9].' '\n' | sort -t '.' -k4 -n | tail -n 3 127.0.0.1 10.1.252.156 10.1.255.255 [root@mzf ~]# ifconfig | tr -cs '[0-9].' '\n' | sort -t'.' -k4 -nu 127.0.0.1 10.1.252.156 10.1.255.255 2、查出分區空間使用率的最大百分比值 [root@mzf ~]# df -lh | tr -s ' ' | tr ' ' ':' | cut -d: -f5 | tr -d '%' | sort -nr 100 31 19 1 1 Use 3、查出用戶UID最大值的用戶名、UID及shell類型 [root@mzf ~]# cat /etc/passwd | sort -t':' -k3 -n | tail -n 1 | cut -d: -f1,3,7 nfsnobody:65534:/sbin/nologin 4、查出/tmp的權限,以數字方式顯示 [root@mzf ~]# stat /tmp | cut -d: -f2 | cut -d'/' -f1 | tr -cs '[0-9]\n' ' ' | tr -s '\n' ' ' | cut -d' ' -f4 1777 [root@mzf ~]# stat /tmp | cut -d':' -f2 | cut -d' ' -f2 | tr -cs '([0-9]' ':' | cut -d':' -f5 | tr -d '(' 1777 5、5、統計當前連接本機的每個遠程主機IP的連接數,并按從大到小排序 [root@mzf ~]# netstat -nt | tr -s ' ' | cut -d' ' -f5 | tr -d '[:alpha:])' | cut -d: -f1 | sort -t'.' -k4 -nu | uniq -c 1 #這里的空白行不算 1 10.1.250.34:1836
原創文章,作者:ailisa5520,如若轉載,請注明出處:http://www.www58058.com/30119