每天學點Linux-選取命令CUT和GREP


  選取命令就是將一段數據經過分析后,取出我們所想要的。或者是經由分析關鍵詞,取得我們所想要的那一行!一般來說,選取命令通常是針對一行一行的數據來進行分析的, 並不是整篇信息分析。
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

   輸出的三個數字中,分別代表: 行、字數、字符數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM