首頁 > 軟體

Linux文字處理命令(wc,cut,sort,uniq,diff,patch)詳解

2020-06-16 17:35:51

我相信大家在使用Linux過程中總會遇到想要提取某些自己需要的資訊的情況,比如如下這四種情況:
1、找出ifconfig命令結果中eno16777728的IPv4地址
2、查出分割區空間使用率的最大百分比值
3、查出/tmp的許可權,以數位方式顯示
這個時候,我們使用命令當然也可以檢視,不過還需要自己通過眼睛去過濾不需要的資訊,多費勁。如何讓自己更輕鬆的看到自己想看到自己想看的資訊呢?今天的文字處理命令能滿足我們的簡單需求。

wc 此wc非彼WC,在這裡wc是word count的簡寫

wc - print newline, word, and byte counts for each file
其表達格式:wc [OPTION]... [FILE]...
常用選項:
      -l:lines 只顯示行數
      -w:words  只顯示單詞總數
      -c:bytes  只顯示該內容位元組總數

下面以範例來具體顯示wc的功用
建立/test目錄 建立/test/wc.txt檔案
[root@localhost test]# cat > 1
hello me
hello my boy

使用cat在wc.txt內輸入一些字元

[root@localhost test]# wc wc.txt 
 2  5 22 wc.txt  第一個2代表行數 第二個5代表單詞數 第三個22代表該內容位元組總數 
[root@localhost test]# wc -l wc.txt 
2 wc.txt
[root@localhost test]# wc -c wc.txt 
22 wc.txt
[root@localhost test]# wc -w wc.txt 
5 wc.txt

cut 
cut - remove sections from each line of files
表達格式:cut OPTION... [FILE]...
常用選項:
      -d<char> : 以指定的字元為分隔符
      -f #(單個欄位)|#-#(連續多個欄位)|#,...,#(離散多個欄位)
      -c 按字元切割
      --output-delimiter=STRING指定輸出分隔符
以/etc/passwd檔案為物件做實驗
1、取使用者名稱及使用者UID並指定輸出的分隔符為#

[root@localhost test]# tail -5 /etc/passwd
laowang:x:4322:4322::/home/laowang:/bin/bash
u1:x:4323:4323:UUU:/home/u1:/bin/csh
u2:x:4324:4324::/home/u2:/bin/bash
u3:x:4325:4325::/home/u3:/bin/bash
u4:x:4326:4326::/home/u4:/sbin/nologin

通過上面內容,我們可以確定我們需要的內容在第一節跟第三節,同事分隔符為“:”
[root@localhost test]# cut -d: -f 1,3 /etc/passwd --output-delimiter=#
root#0
bin#1
daemon#2
adm#3
..

2、檢視/etc/passwd檔案最後一行,且從第5個字元開始擷取到第十個字元.
[root@localhost test]# tail -1 /etc/passwd | cut -c 5-10
:4326:

sort 排序

sort - sort lines of text files
表達格式: sort [OPTION]... [FILE]...
常用選項:
      -t CHAR:指定分隔符
      -k #:用於排序比較的欄位
      -n:基於數值大小排序
      -r:逆序排列
      -f:忽略字元大小寫
      -u:重複內容只保留一行
還是以/etc/passwd為物件測試
顯示UID最大的使用者及其預設shell
[root@localhost test]# sort -t: -k 3 -n /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...
basher:x:4329:4329::/home/basher:/bin/bash
nologin:x:4330:4330::/home/nologin:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

顯示成功,但是結果並不直觀,我們在利用上面的cut命令對結果進行進一步加工

[root@localhost test]# sort -t: -k 3 -n /etc/passwd | tail -1 | cut -d: -f 1,7
nfsnobody:/sbin/nologin

uniq 報告或移除重複的行
uniq - report or omit repeated lines
表達格式:uniq [OPTION]... [INPUT [OUTPUT]]
常用選項:
      -c:顯示每行的重複次數
      -u:僅顯示未曾重複過的行
      -d:僅顯示重複過的行
為了演示uniq命令方便,我們建立一個有重複行的檔案/test/uniq.txt
[root@localhost test]# cat uniq.txt 
qqqq
qqqq
qqqq
dfsdf
aa
bb
bb
cc
q
[root@localhost test]# uniq uniq.txt 
qqqq
dfsdf
aa
bb
cc
q

uniq 加檔案預設將重複的內容隱藏。
[root@localhost test]# uniq -c uniq.txt 
      3 qqqq
      1 dfsdf
      1 aa
      2 bb
      1 cc
      1 q
      1 q
[root@localhost test]# uniq -u uniq.txt 
dfsdf
aa
cc
q
[root@localhost test]# uniq -d uniq.txt 
qqqq
bb

--------------------------------------------------------------------------------
diff  逐行比較檔案的異同

diff - compare files line by line
diff [OPTION]... FILES
常用選項:

      -u:使用unified機制,即顯示要修改的行的上下文,預設3行
[root@localhost test]# cat diff1 diff2
abcd
abcde
abcd
bcd
abcde
bc
[root@localhost test]# diff diff1 diff2   
1c1
< abcd
---
> bcd
3c3
< abcd
---
> bc
[root@localhost test]# diff -u diff1 diff2
--- diff1      2016-08-05 19:46:36.985538120 +0800
+++ diff2      2016-08-05 19:46:54.951836769 +0800
@@ -1,3 +1,3 @@
-abcd
+bcd
 abcde
-abcd
+bc

patch 向檔案打修補程式
基本概念 patch - apply changes to files
表達格式patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile]
              [-o outfile][-p num][-r rejectfile][file]
patch [OPTION] -l /PATH/PATH_FILE /PATH/OLDFILE
patch /PATH/OLDFILE < /PATH/PATH_FILE

--------------------------------------------------------------------------------
常用的簡單文字處理命令介紹完畢,下面來利用本文介紹的命令來解決開頭提出的四個問題

1、找出ifconfig命令結果中eno16777728的IPv4地址
ifconfig | tr -cs '[:digit:].' ':'| cut -d: -f 5
10.1.253.79

以上共分3步
1)先將ifconfig的內容當做tr的基本輸入內容;2)將第一步的內容中所有非數位的內容替換為":"並壓縮;3)看所需的IP在第幾段然後使用cut命令進行切割

2、查出分割區空間使用率的最大百分比值
檢視分割區空間命令為df
[root@localhost test]# df | tr -s ' ' ':'| cut -d: -f 5| tr -d '%'|sort -n|tail -1
29

要實現上述內容需要
1)使用df列出分割區空間使用率的內容,
2)之後使用tr將空格替換為:並進行壓縮,
3)再之後使用cut進行切割將使用率的列取出,
4)再使用tr將%剔除,
5)之後使用sort按數值大小進行排序
6)最後再使用tail取最後一行的最大值。

3、查出/tmp的許可權,以數位方式顯示
檢視/tmp許可權可以使用stat,它可以自動顯示處其許可權對應的數值,剩下的只需要我們將數位從內容中取出即可。
[root@localhost test]# stat /tmp/ | tr -cs '[:digit:]' ':'| cut -d: -f 9
1777

1)先顯示許可權內容
2)將內容中所有非數位替換為“:”並壓縮
3)數出對應的許可權數位在第幾段後進行切割

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-08/134044.htm


IT145.com E-mail:sddin#qq.com