天天看點

Linux基礎之文本處理指令(wc,cut,sort,uniq,diff,patch)

我相信大家在使用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檔案

1

2

3

<code>[root@localhost </code><code>test</code><code>]</code><code># cat &gt; 1</code>

<code>hello me</code>

<code>hello my boy</code>

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

4

5

6

7

8

<code>[root@localhost </code><code>test</code><code>]</code><code># wc wc.txt </code>

<code> </code><code>2  5 22 </code><code>wc</code><code>.txt   第一個2代表行數 第二個5代表單詞數 第三個22代表該内容位元組總數 </code>

<code>[root@localhost </code><code>test</code><code>]</code><code># wc -l wc.txt </code>

<code>2 </code><code>wc</code><code>.txt</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># wc -c wc.txt  </code>

<code>22 </code><code>wc</code><code>.txt</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># wc -w wc.txt  </code>

<code>5 </code><code>wc</code><code>.txt</code>

cut  

cut - remove sections from each line of files

表達格式:cut OPTION... [FILE]...

      -d&lt;char&gt; : 以指定的字元為分隔符

      -f #(單個字段)|#-#(連續多個字段)|#,...,#(離散多個字段) 

      -c 按字元切割

      --output-delimiter=STRING指定輸出分隔符

以/etc/passwd檔案為對象做實驗

1、取使用者名及使用者UID并指定輸出的分隔符為#

<code>[root@localhost </code><code>test</code><code>]</code><code># tail -5 /etc/passwd</code>

<code>laowang:x:4322:4322::</code><code>/home/laowang</code><code>:</code><code>/bin/bash</code>

<code>u1:x:4323:4323:UUU:</code><code>/home/u1</code><code>:</code><code>/bin/csh</code>

<code>u2:x:4324:4324::</code><code>/home/u2</code><code>:</code><code>/bin/bash</code>

<code>u3:x:4325:4325::</code><code>/home/u3</code><code>:</code><code>/bin/bash</code>

<code>u4:x:4326:4326::</code><code>/home/u4</code><code>:</code><code>/sbin/nologin</code>

通過上面内容,我們可以确定我們需要的内容在第一節跟第三節,同僚分隔符為“:”

<code>[root@localhost </code><code>test</code><code>]</code><code># cut -d: -f 1,3 /etc/passwd --output-delimiter=#</code>

<code>root</code><code>#0</code>

<code>bin</code><code>#1</code>

<code>daemon</code><code>#2</code>

<code>adm</code><code>#3</code>

<code>..</code>

2、檢視/etc/passwd檔案最後一行,且從第5個字元開始截取到第十個字元.

<code>[root@localhost </code><code>test</code><code>]</code><code># tail -1 /etc/passwd | cut -c 5-10</code>

<code>:4326:</code>

sort 排序

sort - sort lines of text files

表達格式: sort [OPTION]... [FILE]...

      -t CHAR:指定分隔符

      -k #:用于排序比較的字段

      -n:基于數值大小排序

      -r:逆序排列

      -f:忽略字元大小寫

      -u:重複内容隻保留一行

還是以/etc/passwd為對象測試

顯示UID最大的使用者及其預設shell

9

<code>root@localhost </code><code>test</code><code>]</code><code># sort -t: -k 3 -n /etc/passwd </code>

<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

<code>bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>

<code>daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>

<code>adm:x:3:4:adm:</code><code>/var/adm</code><code>:</code><code>/sbin/nologin</code>

<code>...</code>

<code>basher:x:4329:4329::</code><code>/home/basher</code><code>:</code><code>/bin/bash</code>

<code>nologin:x:4330:4330::</code><code>/home/nologin</code><code>:</code><code>/sbin/nologin</code>

<code>nfsnobody:x:65534:65534:Anonymous NFS User:</code><code>/var/lib/nfs</code><code>:</code><code>/sbin/nologin</code>

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

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

<code>nfsnobody:</code><code>/sbin/nologin</code>

uniq 報告或移除重複的行

uniq - report or omit repeated lines

表達格式:uniq [OPTION]... [INPUT [OUTPUT]]

      -c:顯示每行的重複次數

      -u:僅顯示未曾重複過的行

      -d:僅顯示重複過的行

為了示範uniq指令友善,我們建立一個有重複行的檔案/test/uniq.txt

10

11

12

13

14

15

16

17

<code>[root@localhost </code><code>test</code><code>]</code><code># cat uniq.txt </code>

<code>qqqq</code>

<code>dfsdf</code>

<code>aa</code>

<code>bb</code>

<code>cc</code>

<code>q</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># uniq uniq.txt </code>

uniq 加檔案預設将重複的内容隐藏。

<code>[root@localhost </code><code>test</code><code>]</code><code># uniq -c uniq.txt </code>

<code>      </code><code>3 qqqq</code>

<code>      </code><code>1 dfsdf</code>

<code>      </code><code>1 aa</code>

<code>      </code><code>2 bb</code>

<code>      </code><code>1 cc</code>

<code>      </code><code>1 q</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># uniq -u uniq.txt  </code>

<code>[root@localhost </code><code>test</code><code>]</code><code># uniq -d uniq.txt  </code>

diff  逐行比較檔案的異同

diff - compare files line by line

diff [OPTION]... FILES

      -u:使用unified機制,即顯示要修改的行的上下文,預設3行

18

19

20

21

22

23

24

25

<code>[root@localhost </code><code>test</code><code>]</code><code># cat diff1 diff2</code>

<code>abcd</code>

<code>abcde</code>

<code>bcd</code>

<code>bc</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># diff diff1 diff2   </code>

<code>1c1</code>

<code>&lt; abcd</code>

<code>---</code>

<code>&gt; bcd</code>

<code>3c3</code>

<code>&gt; </code><code>bc</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># diff -u diff1 diff2</code>

<code>--- diff1       2016-08-05 19:46:36.985538120 +0800</code>

<code>+++ diff2       2016-08-05 19:46:54.951836769 +0800</code>

<code>@@ -1,3 +1,3 @@</code>

<code>-abcd</code>

<code>+bcd</code>

<code> </code><code>abcde</code>

<code>+</code><code>bc</code>

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 &lt; /PATH/PATH_FILE 

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

<code>ifconfig</code> <code>| </code><code>tr</code> <code>-cs </code><code>'[:digit:].'</code> <code>':'</code><code>| </code><code>cut</code> <code>-d: -f 5</code>

<code>10.1.253.79</code>

以上共分3步

1)先将ifconfig的内容當做tr的基本輸入内容;2)将第一步的内容中所有非數字的内容替換為":"并壓縮;3)看所需的IP在第幾段然後使用cut指令進行切割

檢視分區空間指令為df

<code>[root@localhost </code><code>test</code><code>]</code><code># df | tr -s ' ' ':'| cut -d: -f 5| tr -d '%'|sort -n|tail -1</code>

<code>29</code>

要實作上述内容需要

1)使用df列出分區空間使用率的内容,

2)之後使用tr将空格替換為:并進行壓縮,

3)再之後使用cut進行切割将使用率的列取出,

4)再使用tr将%剔除,

5)之後使用sort按數值大小進行排序

6)最後再使用tail取最後一行的最大值。

檢視/tmp權限可以使用stat,它可以自動顯示處其權限對應的數值,剩下的隻需要我們将數字從内容中取出即可。

<code>root@localhost </code><code>test</code><code>]</code><code># stat /tmp/ | tr -cs '[:digit:]' ':'| cut -d: -f 9</code>

<code>1777</code>

1)先顯示權限内容

2)将内容中所有非數字替換為“:”并壓縮

3)數出對應的權限數字在第幾段後進行切割

本文轉自 紫色的茶碗 51CTO部落格,原文連結:http://blog.51cto.com/chawan/1834875,如需轉載請自行聯系原作者

繼續閱讀