Linux入門之常見文本處理工具

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便查看調用命令.jpg

解析:這里使用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

解析:截取沒一行第13個字符和第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文件的第14行,而+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

(0)
ailisa5520ailisa5520
上一篇 2016-08-08
下一篇 2016-08-08

相關推薦

  • Linux發展與應用

                                                      &nbsp…

    2017-04-05
  • 馬哥教育網絡班25期-第3周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@localhost ~]# who root     tty1         2016-12-…

    Linux干貨 2016-12-19
  • 馬哥教育網絡班22期+第八周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。    網橋:工作在OSI模型的數據鏈路層,將兩個局域網連起來,根據MAC地址來轉發幀,可以看作是一個“低層的路由器”(路由器工作在OSI模型的網絡層,根據網絡地址如IP地址進行轉發)。它可以有效地聯接兩個LAN,使本地通信限制在本網段內,并…

    Linux干貨 2016-11-17
  • 9.腳本練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; ?declare?-a?shell ????declare?sum_login=0 ????declare?sum_nologin=0 ????shell=($(cat?/etc/pass…

    2017-09-20
  • ansible部署KeepAlived動態站點

    一、設計原因 利用ansible可以自動化部署KeepAlived 的雙方模型(其中包括兩個動態的站點),多組服務器需要一樣的部署時 可以利用ansible寫的程序來代替重復性的操作。 二、設計拓撲結構及服務器詳情   三、詳細步驟 1、環境的搭建 (1)安裝ansible,同時配置私鑰免密碼進行通信 [root@localhost ~]# ssh…

    2015-05-13
  • vim編譯器與shell腳本簡介

    一、vim文本編譯器       vi:Visual Interface,文本編輯器;   文本: ASCII Unicode  文本編輯種類:行編輯器:sed  ;全屏編輯器:nano,vi ,vim ;其他編輯器:gedit(圖形),g…

    Linux干貨 2016-11-24
欧美性久久久久