選取命令就是將一段數據經過分析后,取出我們所想要的。或者是經由分析關鍵詞,取得我們所想要的那一行!一般來說,選取命令通常是針對一行一行的數據來進行分析的, 並不是整篇信息分析。
cut
cut命令可以將一段信息的某一段選取出來,信息處理一行為單位。CUT命令使用格式如下:
[root@www ~]# cut -d'分隔字符' -f fields <==用於有特定分隔字符 [root@www ~]# cut -c 字符區間 <==用於排列整齊的信息 選項與參數: -d :后面接分隔字符。與 -f 一起使用; -f :依據 -d 的分隔字符將一段信息分割成為數段,用 -f 取出第幾段的意思; -c :以字符 (characters) 的單位取出固定字符區間;
范例一:將 PATH 變量取出,我要找出第五個路徑。
[root@www ~]# echo $PATH | cut -d ':' -f 5 # 如同上面的數字顯示,我們是以『 : 』作為分隔,因此會出現 /usr/local/bin # 那么如果想要列出第 3 與第 5 呢?,就是這樣: [root@www ~]# echo $PATH | cut -d ':' -f 3,5
范例二:將 export 輸出的信息,取得第 12 字符以后的所有字符串
[root@www ~]# export declare -x HISTSIZE="1000" declare -x INPUTRC="/etc/inputrc" declare -x KDEDIR="/usr" declare -x LANG="zh_TW.big5" .....(其他省略)..... # 注意看,每個數據都是排列整齊的輸出!如果我們不想要『 declare -x 』時, # 就得這么做: [root@www ~]# export | cut -c 12- HISTSIZE="1000" INPUTRC="/etc/inputrc" KDEDIR="/usr" LANG="zh_TW.big5"
CUT -d命令適合操作具有固定分割符的文本,用 -c 可以處理比較具有格式的輸出數據,還可以指定某個范圍的值,例如第 12-20 的字符,就是 cut -c 12-20。cut 主要的用途在於將『同一行里面的數據進行分解!』最常使用在分析一些數據或文字數據的時候! 這是因為有時候我們會以某些字符當作分割的參數,然后來將數據加以切割,以取得我們所需要的數據。 鳥哥也很常使用這個功能呢!尤其是在分析 log 文件的時候!不過,cut 在處理多空格相連的數據時,可能會比較吃力一點。
grep
cut是將一行信息當中,取出某部分我們想要的,而grep則是分析一行信息, 若當中有我們所需要的信息,就將該行拿出來。其使用方法如下:
[root@www ~]# grep [-acinv] [--color=auto] '搜尋字符串' filename 選項與參數: -a :將 binary 文件以 text 文件的方式搜尋數據 -c :計算找到 '搜尋字符串' 的次數 -i :忽略大小寫的不同,所以大小寫視為相同 -n :順便輸出行號 -v :反向選擇,亦即顯示出沒有 '搜尋字符串' 內容的那一行! --color=auto :可以將找到的關鍵詞部分加上顏色的顯示喔!
具體的操作實例如下:
范例一:將 last 當中,有出現 root 的那一行就取出來; [root@www ~]# last | grep 'root' 范例二:與范例一相反,只要沒有 root 的就取出! [root@www ~]# last | grep -v 'root' 范例三:在 last 的輸出信息中,只要有 root 就取出,並且僅取第一欄 [root@www ~]# last | grep 'root' |cut -d ' ' -f1 # 在取出 root 之后,利用上個命令 cut 的處理,就能夠僅取得第一欄啰! 范例四:取出 /etc/man.config 內含 MANPATH 的那幾行 [root@www ~]# grep --color=auto 'MANPATH' /etc/man.config ....(前面省略).... MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man MANPATH_MAP /usr/bin/X11 /usr/X11R6/man MANPATH_MAP /usr/bin/mh /usr/share/man
排序命令: sort, wc, uniq
sort命令可以進行排序,而且可以依據不同的數據型態來排序,排序的字符與語系的編碼有關。
[root@www ~]# sort [-fbMnrtuk] [file or stdin] 選項與參數: -f :忽略大小寫的差異,例如 A 與 a 視為編碼相同; -b :忽略最前面的空格符部分; -M :以月份的名字來排序,例如 JAN, DEC 等等的排序方法; -n :使用『純數字』進行排序(默認是以文字型態來排序的); -r :反向排序; -u :就是 uniq ,相同的數據中,僅出現一行代表; -t :分隔符,默認是用 [tab] 鍵來分隔; -k :以那個區間 (field) 來進行排序的意思
范例一:個人賬號都記錄在 /etc/passwd 下,請將賬號進行排序。
[root@www ~]# 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
范例二:/etc/passwd 內容是以 : 來分隔的,我想以第三欄來排序,該如何?
[root@www ~]# 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
看到特殊字體的輸出部分了吧?怎么會這樣排列啊?如果是以文字型態來排序的話,原本就會是這樣,想要使用數字排序,使用-n來以數字來排序。
# cat /etc/passwd | sort -t ':' -k 3 -n
uniq
uniq命令可以用來去除重復的數據,僅僅保留一行,其使用方法如下:
[root@www ~]# uniq [-ic] 選項與參數: -i :忽略大小寫字符的不同; -c :進行計數
范例一:使用 last 將賬號列出,僅取出賬號欄,進行排序后僅取出一位;
[root@www ~]# last | cut -d ' ' -f1 | sort | uniq
范例二:承上題,如果我還想要知道每個人的登陸總次數呢?
[root@www ~]# last | cut -d ' ' -f1 | sort | uniq -c 1 12 reboot 41 root 1 wtmp
UNIQ這個命令用來將重復的行刪除掉只顯示一個,舉個例子來說, 你要知道這個月份登陸你主機的用戶有誰,而不在乎他的登陸次數,那么就使用上面的范例, (1)先將所有的數據列出;(2)再將人名獨立出來;(3)經過排序;(4)只顯示一個! 由於這個命令是在將重復的東西減少,所以當然需要『配合排序過的文件』來處理啰!
wc
如果想要知道文件里面有多少字?多少行?多少字符的話可以利用 wc 這個命令來達成,WC可以幫我們計算輸出的信息的整體數據。其使用方法如下:
[root@www ~]# wc [-lwm] 選項與參數: -l :僅列出行; -w :僅列出多少字(英文單字); -m :多少字符;
范例一:那個 /etc/man.config 里面到底有多少相關字、行、字符數?
[root@www ~]# cat /etc/man.config | wc 141 722 4617
輸出的三個數字中,分別代表: 行、字數、字符數