Linux-命令-文本處理

在這裏插入圖片描述@[toc]

1、cat

  • 全名:catenate

  • 用途:顯示文件內容

  • 常用選項

    cat <選項> [fiel_name] 
    
    • -n:同時顯示行數
  • tac命令也是顯示文件內容

  • 例子:顯示行數

    dream:2_線性表(鏈式存儲) dream$ cat -n main.c
         1	#include <stdio.h>
         2	#include <stdlib.h>
         3	#include <stdbool.h>
         4	
         5	typedef int Element;
         6	typedef int Position;
         7	typedef struct LinkNode *PtrLNode;
    		...
    

2、more

  • 全名:more
  • 用途:分頁顯示文件內容,空格或f翻頁,回車換行,q或Q退出

3、less

  • 全名:less
  • 用途:分頁顯示文件內容,可向上翻頁,還可以進行搜索
  • 使用less命令後,可以按/<匹配字符串>進行搜索

4、head

  • 全名:head

  • 用途:不指定參數時顯示文件前10行

  • 常用選項

    head [選項] <file_name>
    
    • -n:指定參數顯示文件前n行
  • 例子:顯示前5行

    dream:2_線性表(鏈式存儲) dream$ head -n 5 main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    typedef int Element;
    

5、tail

  • 全名:tail

  • 用途:不指定參數顯示文件後10行

  • 常用選項

    tail [選項] <file_name>
    
    • -n:指定行數
    • -f:動態顯示,可用於監控

6、grep

  • 全名:grep

  • 用途:在輸入數據中提取和匹配條件符合的字符串行,可作爲輸入數據的有文件內容,其它命令輸出等等

  • 常用選項:比較常用的是將其它命令的輸出通過管道符|作爲grep的輸入數據來查找

    grep [選項] "搜索內容" <文件名>
    
    • 選項:
      • -A n 列出符合條件的行,並列出後續的n行
      • -B n 列出符合條件的行,並列出前面的n行
      • -c 統計找到的符合條件的字符串的次數
      • -i 忽略大小寫
      • -n 連行號一起輸出
      • -v 反向查找(即查找和條件不匹配的行)
      • --color=auto 搜索出的關鍵字用顏色顯示
  • 例子

    dream:tmp dream$ cat test.txt 
    name  age  class  grade
    xzj   20   10     90
    wy    21   10     92
    lq    19   8      95
    wjy   20   10     94
    ll    22   8      90
    dream:tmp dream$ cat test.txt | grep -n "xzj"
    2:xzj   20   10     90
    dream:tmp dream$ cat test.txt | grep -nv "xzj"
    1:name  age  class  grade
    3:wy    21   10     92
    4:lq    19   8      95
    5:wjy   20   10     94
    6:ll    22   8      90
    
    • | 管道符用於連接兩個命令,即將前一個命令輸出作爲後一個命令輸入
    • 注意:管道符要求前面的命令必須正確
  • grep有一個常用用法

    dream:tmp dream$ ps aux | grep bash          # 查看進程時不加後面的grep -v grep
    dream            26126   0.0  0.0  4296240   1732 s001  S+    8:17下午   0:00.03 -bash
    dream            12342   0.0  0.0  4296240   1368 s000  S    五09下午   0:00.70 -bash
    dream            26852   0.0  0.0  4267752    816 s000  S+    9:25下午   0:00.01 grep --color=auto bash
    dream:tmp dream$ ps aux | grep bash | grep -v grep
    dream            12342   0.7  0.0  4296240   1372 s000  S    五09下午   0:00.71 -bash
    dream            26126   0.0  0.0  4296240   1732 s001  S+    8:17下午   0:00.03 -bash
    

7、sort

  • 全名:sort

  • 用途:依據不同的數據類型來進行排序

  • 常用選項

    sort [選項] <file>
    
    • -f 忽略大小寫
    • -b 忽略每行前面的空白部分
    • -n 以數值類型進行排序,默認使用的是字符串類型
    • -r 反向排序
    • -u 輸出重複行
    • -t 指定分隔符,默認爲分隔符
    • -k n[,m] 按照指定的字段範圍來排序,從第n個字段開始,到第m個字段結束,默認到行尾
  • 例子

    dream:tmp dream$ cat test.txt 
    name  age  class  grade
    xzj   20   10     90
    wy    21   10     92
    lq    19   8      95
    wjy   20   10     94
    ll    22   8      90
    dream:tmp dream$ cat test.txt | grep -v name | sort -k 4
    # 可以看到並沒有按最後一個字段排序,因爲不是使用的按數值類型排序
    ll    22   8      90
    lq    19   8      95
    xzj   20   10     90
    wy    21   10     92
    wjy   20   10     94
    dream:tmp dream$ cat test.txt | grep -v name | sort -n -k 4
    # 按數值類型排序
    ll    22   8      90
    xzj   20   10     90
    wy    21   10     92
    wjy   20   10     94
    lq    19   8      95
    

8、uniq

  • 全名:unique
  • 用途:取消重複行,同sort -u

9、wc

  • 全名:word count

  • 用途:用於統計文本的行數、單詞數或字符數,輸入可爲文件或其它命令輸出

  • 常用選項:

    wc [選項] <file>
    
    • -l 只統計行數
    • -w 只統計單詞數
    • -m 只統計字符數
  • 例子

    dream:tmp dream$ wc /etc/passwd 
         108     294    6774 /etc/passwd
    dream:tmp dream$ ls | wc -w        # 查看當前目錄下有多少文件和目錄
          13
    
  • 使用wc命令統計服務器上有多少個正常連接

    dream:tmp dream$ netstat -an | grep ESTABLISH 
    tcp4       0      0  192.168.1.12.60945     104.84.122.120.443     ESTABLISHED
    tcp4       0      0  192.168.1.12.58060     163.177.81.141.8080    ESTABLISHED
    tcp4       0      0  192.168.1.12.57507     17.188.166.16.5223     ESTABLISHED
    tcp4       0      0  192.168.1.12.57502     17.57.144.116.5223     ESTABLISHED
    dream:tmp dream$ netstat -an | grep ESTABLISH | wc -l
           4
    

10、awk

(1)awk介紹

  • awk編程用於在Linux/UNIX下對文本和數據進行處理,處理的數據可以來自標準輸入、一個或多個文件,或者其它命令的輸出
  • awk的機理:逐行掃描數據,尋找匹配特定條件的行,並在這些行上進行指定動作
  • gawk是awk的GNU版本,在Linux中,awk已經被鏈接到gawk
  • awk的基本語法和c語言類似

(2)awk基本使用

  • printf格式化輸出

    • 在awk中可以識別print輸出和printf輸出(print會自動加換行符,而printf不會),但是在Bash中只能識別標準格式化輸出printf

      printf '<輸出類型|輸出格式>' <輸出內容>
      
      • 輸出類型:
        • %ns 輸出字符串,表示輸出n個字符(不加n默認爲輸出一個字符串)
        • %ni 輸出n個整數數字
        • %m.nf 輸出浮點數,m表示整數位數,n表示小數位數
      • 輸出格式:即轉義字符
    • 注意,printf只能輸出具體數據,不能輸出文件內容或使用管道符

    [dream@192 ~]$ printf 'hello, word!\n'
    hello, word!
    
    [dream@192 ~]$ printf '%s\n' $(date)      # 將date的輸出作爲printf的輸入
    2020年
    03月
    08日
    星期日
    00:24:00
    CST
    
  • awk的內置變量

    在這裏插入圖片描述

  • awk命令格式

    awk '條件1{動作1} [條件2{動作2} ...]' <文件名>
    
    • 條件:一般使用關係表達式作爲條件,如下

在這裏插入圖片描述

  • 動作:格式化輸出/流程控制語句
  • 例子:下面兩個例子都沒有設定條件,所以是每一行都執行了動作
[dream@192 tmp]$ cat test.txt 
1 aaaa 123
2 bbb  456
3 ccccc 78
[dream@192 tmp]$ awk '{printf $1 "\t" $3 "\n"}' test.txt 	# 輸出第1列和第3列第內容
1		123
2		456
3		78

[dream@192 tmp]$ df -h | awk '{printf $1 "\t\t" $3 "\n"}'  # 使用管道符將其它命令輸出作爲輸入
文件系統		已用
/dev/mapper/centos-root		4.7G
devtmpfs		0
tmpfs		0
tmpfs		18M
tmpfs		0
/dev/sda1		179M
tmpfs		4.0K
tmpfs		32K
# 該語句和 df -h | awk '{print $1 "\t\t" $3}' 效果相同,print語句會自動換行

(3)awk的條件使用

  • BEGINEND的使用

    dream:~ dream$ df -h | awk 'BEGIN{print "磁盤使用"} {print $1 "\t\t" $3} END{print "結束!"}'
    磁盤使用
    Filesystem		Used
    /dev/disk1s1		96Gi
    devfs		335Ki
    /dev/disk1s4		4.0Gi
    map		0Bi
    map		0Bi
    結束!
    
    • BEGIN和END只會執行一次
  • 關係運算符的使用

    dream:tmp dream$ cat test.txt 
    name  age  class  grade
    xzj   20   10     90
    wy    21   10     92
    lq    19   8      95
    wjy   20   10     94
    ll    22   8      90
    dream:tmp dream$ cat test.txt | grep -v name | awk '$4>92 {print $0}'
    # grep -v是反向查找,這裏是去除有name的一行
    # $n(n不爲0)表示第n列,而$0表示awk當前讀入的一整行數據
    # awk是一行一行掃描數據,這裏就是awk對輸入的數據一行一行比較第4列,符合條件的就執行動作{print $0}
    lq    19   8      95
    wjy   20   10     94
    

(4)awk流程控制

  • awk中可以寫一些複雜的語句

    dream:tmp dream$ cat test.txt 
    name  age  class  grade
    xzj   20   10     90
    wy    21   10     92
    lq    19   8      95
    wjy   20   10     94
    ll    22   8      90
    dream:tmp dream$ awk 'NR==2{n1=$4} 
    NR==3{n2=$4} 
    NR==4{n3=$4} 
    NR==5{n4=$4} 
    NR==6{n5=$4; sum=n1+n2+n3+n4+n5; avarage=sum/5; print "the avarage is "avarage}' test.txt 
    the avarage is 92.2
    
    • 多個條件{動作}可以使用空格分隔,也可以使用回車分隔
    • 在一個動作中,若有多條語句,使用;分開
    • 在awk中,變量的賦值與調用都不用加$

(5)awk函數

  • awk中可以自定義函數,如下

    function <func_name> (parameters){
    	fucn_body
    }
    
    • 例子如下

      dream:tmp dream$ cat test.txt 
      name  age  class  grade
      xzj   20   10     90
      wy    21   10     92
      lq    19   8      95
      wjy   20   10     94
      ll    22   8      90
      dream:tmp dream$ awk 'function output(name, grade){print name":"grade} NR>=2{output($1, $4)}' test.txt   # 函數一般定義在最開頭
      xzj:90
      wy:92
      lq:95
      wjy:94
      ll:90
      

(6)awk中腳本調用

  • 當把awk語句寫入腳本中,調用腳本時使用-f選項來將文件讀入腳本,例如

    dream:tmp dream$ cat test.txt 
    name  age  class  grade
    xzj   20   10     90
    wy    21   10     92
    lq    19   8      95
    wjy   20   10     94
    ll    22   8      90
    dream:tmp dream$ cat test.awk 
    #!/bin/bash
    
    BEGIN{print "hello----"}
    NR==2{n1=$4}
    NR==3{n2=$4}
    NR==4{n3=$4}
    NR==5{n4=$4}
    NR==6{n5=$4; sum=n1+n2+n3+n4+n5; avarage=sum/5; print "the avarage is "avarage}
    END{print "end!!!!!!"}
    dream:tmp dream$ chmod 755 test.awk 
    dream:tmp dream$ awk -f test.awk test.txt 
    hello----
    the avarage is 92.2
    end!!!!!!
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章