1. 程式人生 > >Linux學習——管道命令、文字提取命令、排序命令、雙向重導向、字元轉換命令、分割命令、引數代換

Linux學習——管道命令、文字提取命令、排序命令、雙向重導向、字元轉換命令、分割命令、引數代換

目錄

 

管道命令

文字提取命令:cut、grep

cut

grep

排序命令:sort、wc、uniq

sort

uniq

wc

雙向重導向:tee

字元轉換命令

tr

col

join

paste

expand

分割命令:split

引數代換:xargs

減號 - 的用途


管道命令

命令格式為 | 符號,左右接一個linux的命令,管道命令允許前一條命令的標準輸出作為下一條命令的標準輸入,例如:

ls -al /etc | less

ls -al /etc命令的標準輸出會作為less命令的標準輸入,用圖片來表示即為:

管线å½ä»¤çå¤ç示æå¾

需要注意,拿上圖來說,非command1位置的管道命令對於標準錯誤輸出並沒有直接處理的能力,並且這個命令必須能夠接收標準輸入資料的能力,例如ls、cp、mv並不會接收標準輸入,只能放在command1的位置

 

文字提取命令:cut、grep

linux部分命令的輸出往往是整坨整坨的輸出。例如ps -aux,而我們需要的資訊往往只是這坨資訊中的一小部分,在整坨資訊中肉眼尋找我們需要的資訊是十分痛苦的,這就體現出文字提取命令的作用了,利用文字提取命令,結合管道,我們可以從這整坨資訊中提取出我們需要的文字,防止眼瞎,不過文字提取命令通常是一行一行進行分析的

cut

這個命令以行為單位處理文字,提取出其中的某一段

cut -d'分隔字元' -f fields <==用於有特定分隔字元
cut -c 字元區間            <==用於排列整齊的資訊
引數:
-d:後接分隔字元,與-f組合使用,處理單位是行
-f:取出分隔後的第幾段
-c:以字元為單位,取出一定範圍內的字元

例如我們對path變數進行分割,並取出第五段:

[[email protected] ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
# 1 |    2   |  3  |    4    |       5      |     6        |    7

[
[email protected]
~]# echo $PATH | cut -d ':' -f 5

使用-c引數

[[email protected] ~]# export
declare -x HISTSIZE="1000"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x LANG="zh_TW.big5"

取出export輸出每行第12個字元以後的所有字串

[[email protected] ~]# export | cut -c 12-
HISTSIZE="1000"
INPUTRC="/etc/inputrc"
KDEDIR="/usr"
LANG="zh_TW.big5"

 

grep

grep以行為單位,若其中有我們需要的資訊,就將該行拿出來

[[email protected] ~]# grep [-acinv] [--color=auto] '搜尋字串' filename
選項與引數:
-a :將 binary 檔案以 text 檔案的方式搜尋資料
-c :計算找到 '搜尋字串' 的次數
-i :忽略大小寫的不同,所有大小寫視為相同
-n :輸出提取的文字在第幾行
-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!
--color=auto :可以將找到的關鍵詞部分加上顏色的顯示喔!

grep命令的使用形式和cut類似,這裡不在舉例,比較有意思的一點是,grep支援正則表示式

 

排序命令:sort、wc、uniq

排序命令的結果與語序有關,其實與編碼方式有關,使用utf-8與gbk的編碼方式可能不一樣

sort

sort是常用的排序命令

[[email protected] ~]# sort [-fbMnrtuk] [file or stdin]
選項與引數:
-f  :忽略大小寫的差異,例如 A 與 a 視為編碼相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字來排序,例如 JAN, DEC 等等的排序方法;
-n  :使用純數字進行排序(預設是以文字型態來排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的資料中,僅出現一行代表;
-t  :分隔符,預設是用 [tab] 鍵來分隔;
-k  :以哪個區間 (field) 來進行排序的意思,一般與-t配合使用

 

例如排序/etc/passwd下的個人賬號

[[email protected] ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

比較方式與程式語言中的比較方式一樣,逐個字母比較編碼的大小

 

-k、-t引數的使用

以:作為分割,選擇第三個欄位作為基準按行進行排序
[[email protected] ~]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

結果之所以這樣是因為sort預設按文字型別排序,如果想用數字排序,可以使用-n引數

 

uniq

uniq可以將排序後的行資料去重

[[email protected] ~]# uniq [-ic]
選項與引數:
-i  :忽略大小寫字元的不同;
-c  :進行計數

範例一:使用 last 將賬號列出,僅取出賬號欄,進行排序後僅取出一位;
[[email protected] ~]# last | cut -d ' ' -f1 | sort | uniq

範例二:承上題,如果我還想要知道每個人的登陸總次數呢?
[[email protected] ~]# last | cut -d ' ' -f1 | sort | uniq -c

 

wc

wc可以統計輸出資訊中的行數、字數、字元數

[[email protected] ~]# wc [-lwm]
選項與引數:
-l  :僅列出行;
-w  :僅列出多少字(英文單字);
-m  :多少字元;

範例一:那個 /etc/man.config 裡面到底有多少相關字、行、字元數?
[[email protected] ~]# cat /etc/man.config | wc 
    141     722    4617
#輸出的三個數字中,分別代表:行、字數、字元數

 

雙向重導向:tee

>可以將資料流重定向到檔案,tee會同時將資料流分送到檔案與螢幕,其用法如下:

[[email protected] ~]# tee [-a] file
選項與引數:
-a  :以累加 (append) 的方式,將資料加入 file 當中!

[[email protected] ~]# last | tee last.list | cut -d " " -f1
# 這個範例可以讓我們將 last的輸出存一份到 last.list 檔案中;並用空格分隔,獲得第一段中的資料,顯示在螢幕上

 

字元轉換命令

 

tr

tr可用來刪除一段資訊中的文字,或者進行文字資訊的替換

[[email protected] ~]# tr [-d] 被替換的字元 替換的字元 
選項與引數:
-d  :刪除資訊當中的某個字串;

範例一:將 last 輸出的資訊中,所有的小寫變成大寫字元:
[[email protected] ~]# last | tr '[a-z]' '[A-Z]'


範例二:將 /etc/passwd 輸出的資訊中,將冒號 (:) 刪除
[[email protected] ~]# cat /etc/passwd | tr -d ':'

也可以在tr中使用正則表示式,因為這個命令是基於正則表示式來取代資料的

 

col

該命令可用來簡單的將tab按鍵轉換為空格鍵

[[email protected] ~]# col [-xb]
該命令只接受標準輸入
選項與引數:
-x  :將 tab 鍵轉換成對等的空格鍵
-b  :過濾掉所有的控制字元,包括RLF和HRLF

 

join

join用於將多個檔案當中,相同資料的一行連線在一起,成為一行,進行標準輸出

[[email protected] ~]# join [-ti12] file1 file2....
選項與引數:
-t  :用來分隔的字元,join 預設以空格符分隔資料,並且比對『第一個欄位』的資料
-i  :忽略大小寫的差異;
-1  :這個是數字的 1 ,代表『第一個檔案要用那個欄位來分析』的意思;
-2  :代表『第二個檔案要用那個欄位來分析』的意思。

join首先會用-t引數指定的分隔符(預設為空格)分隔字元,將第一個檔案對應的欄位比對第二個檔案對應的欄位,若相等,輸出格式為:

比對欄位+第一個檔案除了比對欄位剩下的字元+第二個檔案除了比對字元剩下的字元,例如:

範例一:用 root 的身份,將 /etc/passwd 與 /etc/shadow 相關資料整合成一欄
[[email protected] ~]# head -n 3 /etc/passwd /etc/shadow
==> /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

==> /etc/shadow <==
root:$1$/3AQpE5e$y9A/D0bh6rElAs:14120:0:99999:7:::
bin:*:14126:0:99999:7:::
daemon:*:14126:0:99999:7:::
# 由輸出的資料可以發現這兩個檔案的最左邊欄位都是賬號!且以 : 分隔

[[email protected] ~]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$1$/3AQpE5e$y9A/D0bh6rElAs:14120:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:14126:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:14126:0:99999:7:::

在使用join之前,最好事先對處理的檔案進行排序,否則有些比對專案會被略過

 

paste

paste用於將檔案中的兩行貼在一起,中間以tab按鍵隔開

[[email protected] ~]# paste [-d] file1 file2
選項與引數:
-d  :後面可以接分隔字元。預設是以 [tab] 來分隔的!
-   :如果 file 部分寫成 - ,表示來自 standard input 的資料的意思。

範例一:將 /etc/passwd 與 /etc/shadow 同一行貼在一起
[[email protected] ~]# paste /etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:14126:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:14126:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin    adm:*:14126:0:99999:7:::
# 注意喔!同一行中間是以 [tab] 按鍵隔開的!

範例二:先將 /etc/group 讀出(用 cat),然後與範例一貼上一起!且僅取出前三行
[[email protected] ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
# 這個例子的重點在那個 - 的使用!那玩意兒常常代表 stdin 喔!

 

expand

這個命令用於將tab轉換為多少個空格

[[email protected] ~]# expand [-t] file
選項與引數:
-t  :後面可以接數字。預設情況下,一個 tab 按鍵可以用 8 個空格鍵取代。
      我們也可以自行定義一個 [tab] 按鍵代表多少個空格字元呢!

其有一個配套命令——unexpand,這個命令將空白轉成tab按鍵

 

分割命令:split

split用於將一個大檔案分割成一個一個的小檔案

[[email protected] ~]# split [-bl] file PREFIX
選項與引數:
-b  :按檔案大小為單位進行分割,可加單位,例如 b, k, m 等;
-l  :以行為單位進行分割。
PREFIX :代表前導符的意思,可作為分割檔案的前導文字。

範例一:我的 /etc/termcap 有七百多K,若想要分成 300K 一個檔案時?
[[email protected] ~]# cd /tmp; split -b 300k /etc/termcap termcap
[[email protected] tmp]# ll -k termcap*
-rw-r--r-- 1 root root 300 Feb  7 16:39 termcapaa
-rw-r--r-- 1 root root 300 Feb  7 16:39 termcapab
-rw-r--r-- 1 root root 189 Feb  7 16:39 termcapac
# 那個檔名可以隨意取的啦!我們只要寫上前導文字,小檔案就會以
# xxxaa, xxxab, xxxac 等方式來建立小檔案的!

 

引數代換:xargs

xargs可以讀入標準輸入的資料,並且以空格符或斷行字元進行分割,將其作為後接命令的引數

[[email protected] ~]# xargs [-0epn] command
選項與引數:
-e  :這個是 EOF (end of file) 的意思。後面可以接一個字串,當 xargs 分析到
      這個字串時,就會停止繼續工作!
-p  :在執行每個命令的 argument 時,都會詢問使用者的意思;
-n  :後面接次數,每次 command 命令執行時,要使用幾個引數的意思。

當 xargs 後面沒有接任何的命令時,預設是以 echo 來進行輸出喔!

這裡解釋一下-n引數的作用,一般來說,某些命令後面可以接的引數是有限的,此時,可以利用-n將引數分成若干個部分,每個部分分別再以命令來執行

之前我們說過,有些命令無法從標準輸入中接收資料,對於這些命令,我們無法使用管道命令,因此可以通過xargs來讓該命令從標準輸入接收資料

 

減號 - 的用途

減號可以代表標準輸入與標準輸出