next up previous contents
Next: 實機練習題 Up: 資料導向與管線處理 Previous: 連續命令   Contents

管線命令 (pipe)

  • 管線命令的處理

    \begin{picture}(150,110)
\setlength{\unitlength}{1mm}
\put(0,5){\dashbox{}(30,1...
...r(0,-1){11}}
\put(43,0){\line(0,1){20}}
\put(98,0){\line(0,1){20}}
\end{picture}
    1. 例題:使用 ls 指令輸出後的內容,被 less 讀取, 並且利用 less 的功能前後翻動相關的資訊。
      [root@linux ~]# ls -al /etc | less
      
    2. 習題:使用 ls 指令輸出/home/csie 內容後,其被 more 讀取。
  • 擷取命令 cut:可以將一段訊息的某一段『切』出來, 處理的訊息以『行』為單位。
    1. cut 指令:
      [root@linux ~]# cut -d'分隔字元' -f fields
      [root@linux ~]# cut -c 字元區間
      選項:
      -d  :後面接分隔字元。與 -f 一起使用;
      -f  :依據 -d 的分隔字元將一段訊息分割成為數段,用 -f 取出第幾段;
      -c  :以字元 (characters) 的單位取出固定字元區間;
      
    2. 將 PATH 變數取出,找出第三個路徑。
      [root@linux ~]# echo $PATH
      /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
      [root@linux ~]# echo $PATH | cut -d ':' -f 5
      # 以 : 作為分隔符號,第五個是 /usr/local/bin。
      # 若要列出第 3 與第 5 個?
      [root@linux ~]# echo $PATH | cut -d ':' -f 3,5
      ## 習題:取出 PATH 變數之第 2 與第 4 個路徑。
      
    3. 將 export 輸出的訊息,取得第 12 字元以後的所有字串
      [root@linux ~]# export
      declare -x HISTSIZE="1000"
      declare -x INPUTRC="/etc/inputrc"
      declare -x KDEDIR="/usr"
      declare -x LANG="zh_TW.big5"
      ......其他省略......
      [root@linux ~]# export | cut -c 12-
      HISTSIZE="1000"
      INPUTRC="/etc/inputrc"
      KDEDIR="/usr"
      LANG="zh_TW.big5"
      ......其他省略......
      # 用 -c 可以處理比較具有格式的輸出資料。
      # 還可以指定某個範圍的值,例如第 12-20 的字元為 cut -c 12-20 等。
      ## 習題:取出 /etc/issue 之第 1 至 13 個字元。
      
    4. 用 last 將本月登入者的資訊中,僅留下使用者大名
      [root@linux ~]# last
      csie  tty1  192.168.1.28   Mon Aug 15 11:55 - 17:48  (05:53)
      csie  tty1  192.168.1.28   Mon Aug 15 10:17 - 11:54  (01:37)
      [root@linux ~]# last | cut -d ' ' -f 1
      # 用 last 可以取得最近一個月登入主機的使用者資訊,
      # 利用空白字元的間隔,取出第一個資訊,就是使用者帳號。
      # 但因 csie tty1 之間空格並非僅有一個,cut -d ' ' -f 1,2的輸出不是 tty1。
      
  • 擷取命令 grep:分析一行訊息,若當中有需要的資訊,就將該行取出。
    1. grep 指令:
      [root@linux ~]# grep [-acinv] '搜尋字串' filename
      選項:
      -a :將 binary 檔案以 text 檔案的方式搜尋資料
      -c :計算找到 '搜尋字串' 的次數
      -i :忽略大小寫的不同
      -n :輸出行號
      -v :反向選擇,亦即顯示出沒有'搜尋字串'內容的那一行。
      
    2. 取出 last 中出現 root 的那一行
      [root@linux ~]# last | grep 'root'
      ## 習題:請找出 /etc/issue 下出現 Mandrake 的那一行。
      
    3. 與上例相反,只要沒有 root 的就取出。
      [root@linux ~]# last | grep -v 'root'
      ## 習題:請找出 /etc/issue 下沒出現 Mandrake 的那一行。
      
    4. 在 last 的輸出訊息中,只要有 root 就取出,並且僅取第一欄
      [root@linux ~]# last | grep 'root' |cut -d ' ' -f1
      ## 習題:在 cat /etc/group 的輸出訊息中,只要有 sshd 就取出,並且僅取第一欄及第三欄。
      
  • 排序命令 sort:可依據不同的資料型態來排序。
    1. sort 指令:
      [root@linux ~]# sort [-fbMnrtuk] [file or stdin]
      選項:
      -f  :忽略大小寫的差異,例如 A 與 a 視為編碼相同;
      -b  :忽略最前面的空白字元部分;
      -M  :以月份的名字來排序,例如 JAN, DEC 等排序方法;
      -n  :使用『純數字』進行排序(預設是以文字型態排序);
      -r  :反向排序;
      -u  :uniq,相同的資料中僅出現一行;
      -t  :分隔符號,預設是 tab 鍵;
      -k  :以第幾個區間 (field) 進行排序,
      
    2. 個人帳號都記錄在 /etc/passwd 下,請將帳號進行排序。
      [root@linux ~]# 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
      # sort 預設『以第一個』資料排序,且以『文字』型態排序。
      
    3. /etc/passwd 內容以 : 分隔,如何以第三欄來排序?
      [root@linux ~]# cat /etc/passwd | sort -t ':' -k 3
      root:x:0:0:root:/root:/bin/bash
      iiimd:x:100:101:IIIMF server:/usr/lib/iiim:/sbin/nologin
      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
      
    4. sort -n 使用數字排序。
      [root@dywhd2 ~]# cat /etc/passwd | sort -t ':' -k 3 -n
      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
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      .......
      
    5. sort 選項間可以不使用空格,-t 可以直接接上分隔字元,不必使用單引號括起來,也不用空隔隔開。
      [root@dywhd2 ~]# sort -t: -nk3 /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
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      ...........
      
    6. 利用 last 將輸出的資料僅取帳號並加以排序
      [root@linux ~]# last | cut -d ' ' -f1 | sort
      ## 習題:請以 cat 顯示 /etc/fstab 檔案內容,切下其第二欄,並排序。
      

  • uniq:將重複的資料僅列出一個顯示
    1. uniq 指令:
      [root@linux ~]# uniq [-ic]
      選項:
      -i  :忽略大小寫字元的不同;
      -c  :進行計數
      
    2. 使用 last 將帳號列出,僅取出帳號欄,進行排序後僅取出一位;
      [root@linux ~]# last | cut -d ' ' -f1 | sort -u
      [root@linux ~]# last | cut -d ' ' -f1 | sort | uniq
      
    3. 承上題,如何知道每個人的登入總次數?
      [root@linux ~]# last | cut -d ' ' -f1 | sort | uniq -c
      ##(1)先將所有的資料列出;(2)再將人名獨立出來;(3)經過排序;(4)只顯示一個。
      
  • wc:計算輸出的訊息的行、字及字元數等
    1. wc 指令:
      [root@linux ~]# wc [-lwm]
      選項:
      -l  :僅列出行;
      -w  :僅列出多少字(英文單字);
      -m  :多少字元;
      
    2. 計算 /etc/man.config 有多少字、行、字元數?
      [root@linux ~]# cat /etc/man.config | wc 
          138     709    4506
      # 輸出的三個數字分別代表:『行、字數、字元數』
      ## 習題:請列出 /etc/issue 有多少字、行、字元數?
      
    3. 如何以 last 指令串取得登入系統的總人次?( last 會輸出空白行與 wtmp 字樣在最底下兩行,其並非帳號內容)
      [root@linux ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l 
      # 利用 grep 取出非空白行以及去除 wtmp 那一行,再計算行數。
      ## 習題:請取得以a-f開頭登入系統的總人次。
      

  • 雙向重導向: tee 工作流程

    \begin{picture}(150,110)
\setlength{\unitlength}{1mm}
\put(0,23){\dashbox{}(30,...
...\{指令列模式\} 讀取、儲存檔案 其他額外功能\}\}\}
\end{picture}
    1. tee 指令:
      [root@linux ~]# tee [-a] file
      選項:
      -a  :以累加 (append) 的方式,將資料加入 file 當中。
      
    2. 將 last 的輸出存一份到 last.list 檔案中
      [root@linux ~]# last | tee last.list | cut -d " " -f1
      
    3. 將 ls 的資料存一份到 ~/homefile,同時螢幕也有輸出訊息。
      [root@linux ~]# ls -l /home | tee ~/homefile | more
      
    4. 將 ls 的資料累加到 ~/homefile ,同時螢幕也有輸出訊息。
      [root@linux ~]# ls -l / | tee -a ~/homefile | more
      

  • 字元轉換命令 tr:可以用來刪除一段訊息當中的文字,或者是進行文字訊息的替換。
    1. tr 指令:
      [root@linux ~]# tr [-ds] SET1 ...
      選項:
      -d  :刪除訊息當中的 SET1 這個字串;
      -s  :取代重複的字元。
      
    2. 將 last 輸出的訊息中,所有的小寫變成大寫字元:
      [root@linux ~]# last | tr '[a-z]' '[A-Z]'
      
    3. 將 /etc/passwd 輸出的訊息中,將冒號 (:) 刪除
      [root@linux ~]# cat /etc/passwd | tr -d ':'
      
    4. 將檔案 /home/csie/txtfile 中的重複字元 p 取代成單一個 q 字元:
      [root@linux ~]# cat /home/csie/txtfile | tr -s 'p' 'q'
      

  • 字元轉換命令 col:濾除標準輸入的反向換行符號。
    1. col 指令:
      [root@linux ~]# col [-bfpx] [-l num]
      選項:
      -b 不輸出任何的退格(backspaces),只列出行末的符號
      -f 允許(不濾除)正向半換行符("fine" 模式). 通常,位在半行分界線的字元會列印到下一行。
      -p 讓無法判別的控制字元通過並列印到輸出。
      -x 以輸出連續空格取替換跳格(tab)
      -lnum 設定緩衝記憶體,以"行"為單位。預設值為 128 行。
      
    2. 轉存 man 指令的輸出資料。
      [root@dywHome2 ~]# man ls |cat -v | sed -n '5,10p'
      N^HNA^HAM^HME^HE               %*<== 夾雜有相當多的控制字元*)
             ls - list directory contents
      
      S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS
             l^Hls^Hs [_^HO_^HP_^HT_^HI_^HO_^HN]... [_^HF_^HI_^HL_^HE]...
      
      [root@dywHome2 ~]# man ls |col -b | cat -v | sed -n '5,10p'
      NAME
             ls - list directory contents
      
      SYNOPSIS
             ls [OPTION]... [FILE]...
      
    3. [tab] 按鍵被取代成空白。
      [root@dywHome2 ~]# cat -A /etc/man.config | sed -n '43,47p'
      MANPATH^I/usr/share/man$     %*<== ^I 符號,就是 [tab]*)
      MANPATH^I/usr/X11R6/man$
      MANPATH^I/usr/local/man$
      MANPATH^I/usr/kerberos/man$
      MANPATH^I/usr/man$
      [root@dywHome2 ~]# cat /etc/man.config | col -x |cat -A | sed -n '43,47p'
      MANPATH /usr/share/man$      %*<== [tab] 按鍵被取代成空白鍵*)
      MANPATH /usr/X11R6/man$
      MANPATH /usr/local/man$
      MANPATH /usr/kerberos/man$
      MANPATH /usr/man$
      

  • join:可以將『兩個檔案當中,有"相同資料"的那一行,將他加在一起』
    1. join 指令:
      [root@linux ~]# join [-ti12] file1 file2
      選項:
      -t  :join 預設以空白字元分隔資料,並且比對『第一個欄位』的資料,
            如果兩個檔案相同,則將兩筆資料聯成一行,且第一個欄位放在第一個。
      -i  :忽略大小寫的差異;
      -1  :代表『第一個檔案要用那個欄位來分析』;
      -2  :代表『第二個檔案要用那個欄位來分析』。
      
    2. 用 root 的身份,將 /etc/passwd 與 /etc/shadow 相關資料整合成一欄
      [root@linux ~]# join -t ':' /etc/passwd /etc/shadow
      bin:x:1:1:bin:/bin:/sbin/nologin:*:12959:0:99999:7:::
      daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:12959:0:99999:7:::
      adm:x:3:4:adm:/var/adm:/sbin/nologin:*:12959:0:99999:7:::
      # /etc/shadow 必須以 root 權限才能動作。
      # /etc/passwd 與 /etc/shadow 都是以 : 分隔欄位,必須使用 -t ':' 規範欄位分隔字元。
      # /etc/shadow 與 /etc/passwd 都是以第一個欄位為帳號名稱。
      
    3. /etc/passwd 第四個欄位是 GID ,其記錄在 /etc/group 中的第三個欄位,如何將兩個檔案整合?
      [root@linux ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
      0:root:x:0:root:/root:/bin/bash:root:x:
      1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
      2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon
      4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:root,adm,daemon
      # /etc/passwd 的第一行內容是 root:x:0:0:root:/root:/bin/bash
      # /etc/group 第一行內容是 root:x:0:
      # 將第一個檔案的第四欄與第二個檔案的第三欄取出,放置到輸出的最前方,剩下的資料加在一起。
      

  • paste:可將兩行貼在一起,且中間以 [tab] 鍵隔開
    1. paste 指令:
      [root@linux ~]# paste [-d] file1 file2
      選項:
      -d  :後面可以接分隔字元。預設是以 [tab] 來分隔的。
      -   :如果 file 部分寫成 - ,表示來自 standard input 的資料。
      
    2. 將 /etc/passwd 與 /etc/shadow 同一行貼在一起
      [root@linux ~]# paste /etc/passwd /etc/shadow
      bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:12959:0:99999:7:::
      daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:12959:0:99999:7:::
      adm:x:3:4:adm:/var/adm:/sbin/nologin    adm:*:12959:0:99999:7:::
      # 同一行中間是以 [tab] 按鍵隔開的。
      
    3. 先將 /etc/group 讀出(用 cat),然後與範例一貼上一起,且僅取出前三行。
      [root@linux ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
      # - 代表 stdin。
      

  • expand:將 [tab] 按鍵轉成空白鍵
    1. expand 指令:
      [root@linux ~]# expand [-t] file
      選項:
      -t  :後面可以接數字。一般,一個 tab 按鍵可以用 8 個空白鍵取代。
           也可以自行定義一個 [tab] 按鍵代表多少個字元。
      
    2. 將 /etc/man.config 內行首為 MANPATH 的字樣取出;僅取前三行;
      [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3
      MANPATH /usr/man
      MANPATH /usr/share/man
      MANPATH /usr/local/man
      # 行首的代表標誌為 ^ 。
      
    3. 承上題,將所有的符號都列出來?(用 cat)
      [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 |cat -A
      MANPATH^I/usr/man$
      MANPATH^I/usr/share/man$
      MANPATH^I/usr/local/man$
      # [tab] 按鍵可以被 cat -A 顯示成為 ^I
      
    4. 承上題,將 [tab] 按鍵設定成 6 個字元?
      [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 | \
      >  expand -t 6 - | cat -A
      MANPATH     /usr/man$
      MANPATH     /usr/share/man$
      MANPATH     /usr/local/man$
      123456123456123456.....
      # 因為 [tab] 的長度為 6 個字元,所以,MAN... 到 /usr 之間隔 12 (兩個 [tab]) 個字元。
      # 如果 tab 改成 9 個字元?
      

  • 分割命令:split 可將檔案分割
    1. split 指令:
      [root@linux ~]# split [-bl] file PREFIX
      選項:
      -b  :後面接欲分割成的檔案大小,可加單位,例如 b, k, m 等;
      -l  :以行數來進行分割。
      
    2. /etc/termcap 有七百多K,如何分成 300K 一個檔案?
      [root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap
      [root@linux tmp]# ls -l termcap*
      -rw-rw-r--  1 root root  307200  8月 17 00:25 termcapaa
      -rw-rw-r--  1 root root  307200  8月 17 00:25 termcapab
      -rw-rw-r--  1 root root  184848  8月 17 00:25 termcapac
      # 只要寫上前導文字xxx,split 就會以 xxxaa, xxxab, xxxac 建立小檔案。
      
    3. 將上面的三個小檔案合成一個檔案,檔名為 termcapback
      [root@linux tmp]# cat termcap* >> termcapback
      
    4. 使用 ls -al / 輸出的資訊中,每十行記錄成一個檔案
      [root@linux tmp]# ls -al / | split -l 10 - lsroot
      # - 會被當成 stdin 或 stdout
      
  • 參數代換:xargs 可以讀入 stdin 的資料,並且以空白字元或斷行字元作為分辨,將 stdin 的資料分隔成為 arguments。
    1. xargs 指令:使用於非管線處理命令。
      [root@linux ~]# xargs [-0epn] command
      選項:
      -0  :如果輸入的 stdin 含有特殊字元,例如 `, \, 空白鍵等等字元時,這個 -0 參數
            可以將他還原成一般字元。
      -e  :EOF (end of file) 。當 xargs 分析到其後接的字串時,會停止繼續工作。
      -p  :在執行每個指令的 argument 時,都會詢問使用者;
      -n  :後面接次數,每次 command 指令執行時,要使用幾個參數。看範例三。
      當 xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出。
      
    2. 將 /etc/passwd 內的第一欄取出,僅取三行,使用 finger 指令將每個帳號內容秀出來
      [root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs finger
      Login: root                             Name: root
      Directory: /root                        Shell: /bin/bash
      Never logged in.
      No mail.
      No Plan.
      ......底下省略.....
      # 利用 cut 取出帳號名稱,用 head 取出三個帳號。
      # 由 xargs 將三個帳號的名稱變成 finger 後面需要的參數。
      # 上例為 finger root 後的結果。
      
    3. 同上題,每次執行 finger 時,都要詢問使用者是否動作?
      [root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs -p finger
      finger root bin daemon ?...y
      ......底下省略.....
      
    4. 將所有的 /etc/passwd 內的帳號都以 finger 查閱,但一次僅查閱五個帳號
      [root@linux ~]# cut -d':' -f1 < /etc/passwd | xargs -p -n 5 finger
      finger root bin daemon adm lp ?...y
      ......底下省略.....
      # 某些指令後面可以接的 arguments 是有限制的,不能無限制的累加,
      # 此時可以利用 -n 將參數分成數個部分,每個部分分別再以指令來執行。
      
    5. 同上題,但當分析到 lp 就結束這串指令?
      [root@linux ~]# cut -d':' -f1 < /etc/passwd | xargs -p -e'lp' finger
      finger root bin daemon adm ?...
      # -e'lp' 中間沒有空白鍵。
      # 上例中第五個參數是 lp ,
      # 分析到字串 lp 時,後面的其他 stdin 的內容會被 xargs 捨棄掉。
      
  • 關於減號 - 的用途:代替 stdin 與 stdout
    [root@linux ~]# tar -cvf - /home | tar -xvf -
    # 將 /home 裡面的檔案打包,打包的資料傳送到 stdout;
    # 利用管線處理,將tar -cvf - /home 傳送給後面的 tar -xvf -。
    # 後面的 - 則是取用前一個指令的 stdout。
    

練習題

  1. 如何使用管線命令,以 ls 指令輸出 /home/csie 內容後,其被 more 讀取?
    Sol. ls /home/csie | more
  2. 如何使用管線命令,以 echo $PATH 指令輸出 PATH 路徑後,再以指令 cut 切出 其第三個路徑?
    Sol. echo $PATH | cut -d ':' -f 3
  3. 如何使用管線命令,以 echo $PATH 指令輸出 PATH 路徑後,再以指令 cut 切出 其第二及五個路徑?
    Sol. echo $PATH | cut -d ':' -f 2,5
  4. 如何使用管線命令,將 export 指令輸出,用 cut 切出每行的第 12 字元以後的所有字串?
    Sol. export | cut -c 12-
  5. 如何使用管線命令,將 ls -al 指令輸出,用 cut 切出每行的第 10 至 22 字元?
    Sol. ls -al | cut -c 10-22
  6. 如何使用管線命令,將 last 指令輸出,用 grep 取出出現 root 的那一行?
    Sol. last | grep 'root' (root, "root"亦可)
  7. 如何使用管線命令,將 last 指令輸出,用 grep 取出沒有出現 root 的那一行?
    Sol. last | grep -v 'root' (root, "root"亦可)
  8. 如何使用管線命令,將 last 指令輸出,用 grep 取出出現 root 的那一行並計算找到的次數?
    Sol. last | grep -c 'root' (root, "root"亦可)
  9. 如何使用管線命令,將 last 指令輸出,用 grep 取出出現 root (忽略大小寫的不同) 的那一行?
    Sol. last | grep -i 'root' (root, "root"亦可)
  10. 如何使用管線命令,將 last 指令輸出,用 grep 取出出現 root 的那一行並輸出行號?
    Sol. last | grep -n 'root' (root, "root"亦可)
  11. 如何使用管線命令,將 last 指令輸出,用 grep 取出出現 root 的那一行並且用 cut 僅取第一欄?
    Sol. last | grep 'root' | cut -d ' ' -f1 (root 不加引號及加雙引號亦可)
  12. 如何使用管線命令,找出 /etc/issue 下出現 Mandrake 的那一行?
    Sol. cat /etc/issue | grep 'Mandrake' (Mandrake 不加引號及加雙引號亦可)
  13. 如何使用管線命令,找出 /etc/issue 下沒有出現 Mandrake 的那一行?
    Sol. cat /etc/issue | grep -v 'Mandrake' (Mandrake 不加引號及加雙引號亦可)
  14. 如何使用管線命令,在 cat /etc/group 的輸出訊息中,只要有 sshd 就取出,並且僅取第一欄及第三欄?
    Sol. cat /etc/group | grep 'sshd' | cut -d ':' -f1,3 (sshd 不加引號及加雙引號亦可)
  15. 如何使用管線命令,在 cat /etc/passwd 的輸出訊息中,以第三欄進行帳號排序?
    Sol. cat /etc/passwd | sort -t ':' -k 3
  16. 如何使用管線命令,在 cat /etc/passwd 的輸出訊息中,以第三欄且以數字進行帳號排序?
    Sol. cat /etc/passwd | sort -t ':' -k 3 -n
  17. 如何使用管線命令,將 last 指令輸出,僅取帳號並加以排序?
    Sol. last | cut -d ' ' -f1 | sort
  18. 如何使用管線命令,將指令 cat /etc/fstab 輸出,切下其第二欄並排序?
    Sol. cat /etc/fstab | cut -d ' ' -f2 | sort
  19. 如何使用管線命令,將 last 指令輸出,僅取帳號並加以排序,且相同的帳號僅出現一行?
    Sol. last | cut -d ' ' -f1 | sort -u 或 last | cut -d ' ' -f1 | sort | uniq
  20. 如何使用管線命令,將 last 指令輸出,僅取帳號並加以排序,且相同的帳號僅出現一行並計算每個帳號的登入總次數?
    Sol. last | cut -d ' ' -f1 | sort | uniq -c
  21. 如何使用管線命令,計算 /etc/man.config 有多少字、行、字元數?
    Sol. cat /etc/man.config | wc
  22. 如何使用管線命令,以一行指令串取得登入系統的總人次?
    Sol. last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
  23. 如何使用雙向重導向命令,將 last 指令輸出存一份到 last.list 檔案中,而螢幕上僅秀出帳號?
    Sol. last | tee last.list | cut -d ' ' -f1
  24. 如何使用雙向重導向命令,將 ls /home 的資料累加到 /homefile ,同時螢幕也以 more 輸出訊息?
    Sol. ls /home | tee -a /homefile | more|
  25. 如何使用管線命令,將 last 輸出的訊息中,所有的小寫變成大寫字元?
    Sol. last | tr '[a-z]' '[A-Z]'
  26. 如何使用管線命令,將 cat /etc/passwd 輸出的訊息中,所有的冒號 (:) 刪除?
    Sol. cat /etc/passwd | tr -d ':'
  27. 如何使用管線命令,將 cat /etc/passwd 輸出的訊息中,所有的重複字元 p 取代成單一個 q 字元?
    Sol. cat /home/csie/txtfile | tr -s 'p' 'q'
  28. 線上說明文件 man page 常夾雜許多控制符號,如何將 man ls 轉存為一般不含椌制符號的文字檔 ls.txt?
    Sol. man ls | col -b > ls.txt
  29. 如何將設定檔 /etc/man.config 中的 [tab] 改成空白,且轉存文字檔 man.txt?
    Sol. cat /etc/man.config | col -x > man.txt
  30. 如何用 root 的身份,將 /etc/group 與 /etc/gshadow 相關資料整合成一欄?
    Sol. join -t ':' /etc/group /etc/gshadow
  31. 如何用 root 的身份,將 /etc/passwd 與 /etc/shadow 相關資料整合成一欄?
    Sol. join -t ':' /etc/passwd /etc/shadow
  32. /etc/passwd 第四個欄位是 GID,其記錄在 /etc/group 中的第三個欄位,如何用 root 的身份,將兩個檔案整合?
    Sol. join -t ':' -1 4 /etc/passwd -2 3 /etc/group
  33. 如何用 root 的身份,將 /etc/fstab 與 /etc/mtab 相關資料整合成一欄?
    Sol. join /etc/fstab /etc/mtab
  34. 如何用 root 的身份,將 /etc/passwd 與 /etc/shadow 同一行貼在一起,且中間是以 [tab] 按鍵隔開?
    Sol. paste /etc/passwd /etc/shadow
  35. 如何用 root 的身份,將 /etc/passwd 與 /etc/shadow 同一行貼在一起,且中間是以冒號 : 隔開?
    Sol. paste -d ":" /etc/passwd /etc/shadow
  36. 如何將 /etc/man.config 內行首為 MANPATH 的字樣取出,且僅取前三行?
    Sol. grep '^MANPATH' /etc/man.config | head -n 3
  37. 如何將 /etc/man.config 內行首為 MANPATH 的字樣取出,且僅取前三行並用 cat 將所有的符號都列出來?
    Sol. grep '^MANPATH' /etc/man.config | head -n 3 | cat -A
  38. 如何將 /etc/man.config 內行首為 MANPATH 的字樣取出,且僅取前三行,並將 [tab] 按鍵設定成 9 個字元,最後用 cat 將所有的符號都列出來?
    Sol. grep '^MANPATH' /etc/man.config | head -n 3 | expand -t 9 - | cat -A
  39. /etc/termcap 有七百多 Mbytes,如何分成 300M 一個檔案?
    Sol. split -b 300m /etc/termcap termcap
  40. /etc/termcap 有七百多 Kbytes,如何分成 300K 一個檔案?
    Sol. split -b 300k /etc/termcap termcap
  41. /etc/termcap 有七百多 Kbytes,如何分成 300K 一個檔案,會產生那幾個檔案?
    Sol. termcapaa, termcapab 及 termcapac
  42. 有一檔案以 split 分成多個小檔案 termcap??,如何將其合成一個檔案名為 termcap?
    Sol. cat termcap?? » termcap
  43. 如何將 ls -al / 輸出的資訊,每十行記錄成一個檔案 lsroot?
    Sol. ls -al / | split -l 10 - lsroot
  44. 如何將 /etc/passwd 內的第一欄取出,僅取三行,使用指令 finger 將每個帳號內容秀出來?
    Sol. cut -d ':' -f1 < /etc/passwd | head -n 3 | xargs finger
  45. 如何將 /etc/passwd 內的第一欄取出,僅取三行,使用指令 finger 將每個帳號內容秀出來,且每次執行 finger 時,都要詢問使用者是否動作?
    Sol. cut -d ':' -f1 < /etc/passwd | head -n 3 | xargs -p finger
  46. 如何將所有的 /etc/passwd 內的第一欄取出,使用指令 finger 查閱帳號內容,但一次僅查閱五個帳號,且每次執行 finger 時,都要詢問使用者是否動作?
    Sol. cut -d ':' -f1 < /etc/passwd | xargs -p -n 5 finger
  47. 如何將所有的 /etc/passwd 內的第一欄取出,使用指令 finger 查閱帳號內容,但當分析到 lp 就結束這串指令?
    Sol. cut -d ':' -f1 < /etc/passwd | xargs -p -e'lp' finger
  48. 如何將 /home 裡面的檔案打包,打包的資料傳送到 stdout,將 /home 裡面的檔案打包,打包的資料傳送到 stdout;再利用管線處理,將 stdout 做為後續 tar -xvf 的 stdin 解壓縮?
    Sol. tar -cvf - /home | tar -xvf -


next up previous contents
Next: 實機練習題 Up: 資料導向與管線處理 Previous: 連續命令   Contents
2017-06-14