譯者:Nica < nicaliu at gmail dot com >



雖然有些指令 - 像 cd,是直接建在 bash 裡的,但仍有許多重要命令是來自於 coreutils - GNU 套件,其含括了百種的命令。

有些是大家熟知的 ls、mv 和 cat,但這裡要介紹的是一些較少人用、較不起眼的那些,因為相同的工作都被新型程式所取代了。

這些較不為人知的命令,往往反映出電腦使用的沿革,從前你得自行完成所有可能是 Bourne 或 Bash shell 裡該作的事,而不是花一段時間等待程式 - 例如 emacs 或 vi,啟動,不過這段被認為很耗記憶體的時間,而今已是秒殺的快了 (甚至你現在還可以從手機上去執行!)



這裡就來看看這十個好用的命令,或許有一天派得上用場:

1.tac



有個重要指令叫 cat - 它是 concatenate 的簡寫,功能是用來將一個檔案的內容加到另一個,或單純將一個或一組檔案的內容列出在螢幕上:



cat 1.txt 2.txt > 3.txt # 將檔案 1 與 2 的內容加在一起,成為新的檔案 3

cat 3.txt # 將檔案 3 的內容輸出在螢幕上



而 tac 就是 cat 的相反,它能夠以反向方式連結與印出檔案內容。這個命令在某些狀況下很有用,例如想反向印出清單或 log 檔之時。



tac 1.txt > 2.txt # 檔案 2 的內容(順序)與檔案 1 相反

【Nica 實作練習】

[root@JNT2 tmp]# more lsrpm  <= 看 lsrpm 的內容

< valgrind-3.2.1-6.el5

< wireless-tools-28-2.el5

< xorg-x11-xtrans-devel-1.0.1-1.1.fc6

[root@JNT2 tmp]# tac lsrpm > revlsrpm  <= 反序處理存成 revlsrpm

[root@JNT2 tmp]# more revlsrpm  <= 看 revlsrpm 的內容

< xorg-x11-xtrans-devel-1.0.1-1.1.fc6

< wireless-tools-28-2.el5

< valgrind-3.2.1-6.el5

2.tee



你或許經常需要把一個程式的輸出,pipe 為另一個程式的輸入:



ps -e | grep apache



這個指令會把 ps 的輸出餵給 grep,然後顯示現執行中的 apache 程序。



或者也可能需要將命令的輸出,重導成為檔案:



ps -e | grep apache > apache-processes.txt



然而,若你想看結果同時又想把它寫入(一或多個)檔案呢 ? 這就是 tee 派上用場的時侯了:

ps -e | grep bash | tee bash-processes.txt # 將結果列在螢幕上並存成檔案



若你需要多個備份,還可以輸入多個檔名。

【Nica 實作練習】

[root@JNT2 ~]# ps aux | grep httpd | tee /tmp/httpdprocess /tmp/httpdps2

<略>

apache   26722  0.0  1.0 289148 37620 ?        S    09:33   0:11 /usr/sbin/httpd

root     27495  0.0  0.0  61188   728 pts/0    S+   18:26   0:00 grep httpd

root     27496  0.0  0.0  58924   540 pts/0    S+   18:26   0:00 tee /tmp/httpdprocess /tmp/httpdps2



列出 grep httpd 的結果也存在 /tmp/httpdprocess 與 /tmp/httpdps2 裡了 !



[root@JNT2 ~]# more /tmp/httpdprocess

<略>

apache   26722  0.0  1.0 289148 37620 ?        S    09:33   0:11 /usr/sbin/httpd

root     27495  0.0  0.0  61188   728 pts/0    S+   18:26   0:00 grep httpd

root     27496  0.0  0.0  58924   540 pts/0    S+   18:26   0:00 tee /tmp/httpdp

rocess /tmp/httpdps2

[root@JNT2 ~]# more /tmp/httpdps2

<略>

apache   26722  0.0  1.0 289148 37620 ?        S    09:33   0:11 /usr/sbin/httpd

root     27495  0.0  0.0  61188   728 pts/0    S+   18:26   0:00 grep httpd

root     27496  0.0  0.0  58924   540 pts/0    S+   18:26   0:00 tee /tmp/httpdp

rocess /tmp/httpdps2

[root@JNT2 ~]#

3.pr



大部份的印表機現在都會盡可能達成使用者的要求 - 你丟什麼他就印什麼。然而,你仍可能想要在傳給印表機之前,以某種型式為檔案作格式化。例如可能定期要在會議裡討論一份 log 或報告,而你希望它們每個禮拜看起來都一致。



pr 命令是取文字檔給印表機。若你想設定頁碼或行列格式



pr +10 -h"Apache Errors" -l25 error_log | lpr -# 5



由左至右來看 pr 命令,選項設定由 page 10 開始、在每一頁加入標頭、令每頁為 25 行的長度後再加上檔名。其結果之後會 pipe 至 lpr 命令,它會確認檔案傳至印表機的動作,並要求印五份。

4.stat



ls -l 會給顯示一連串有關於檔案的詳細資訊,這對我來說是夠用的了。若你就是想知道更詳盡的內容,可使用 stat 命令取得更多與檔案有關的資訊:



$ stat stat

File: `stat'

Size: 34684 Blocks: 72 IO Block: 4096 regular file

Device: 302h/770d Inode: 7586763 Links: 1

Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2007-01-06 00:35:15.000000000 +0000

Modify: 2006-09-18 09:50:24.000000000 +0100

Change: 2007-01-04 14:51:47.000000000 +0000

【Nica 實作練習】

用 stat 查看 rmduppkg 這個檔案的資訊:

[root@JNT2 tmp]# stat rmduppkg

File: `rmduppkg'

Size: 2437            Blocks: 16         IO Block: 4096   regular file

Device: fd00h/64768d    Inode: 6062094     Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2009-02-26 10:24:14.000000000 +0800

Modify: 2009-02-25 23:11:14.000000000 +0800

Change: 2009-02-26 10:37:17.000000000 +0800

5.yes



yes 是這些奇怪的命令中,功能最有趣的一個。yes 印出字串與換行字元,然後一直重複直到被中斷。



聽來沒什麼,但它的用處卻很多。首先,若你想將互動式的指令變成非互動式的,就用得上它了。



你所執行的一些命令列的程式裡,有些會問一些像 "Are you sure?" 之類的問題。例如:

yes 5 | command



這個動作會執行 command 然後傳送字串 5 與換行字元 (就像你按 Enter 鍵那樣的意思)。



不消說,你可以用 yes 讓處理器使用率達百分百,例如:當你想測試一些風扇或冷卻系統的時侯,又或是當你想好好操一下這台機器的時侯。

【Nica 實作練習】

[root@JNT2 tmp]# yes y

<略>

y

y

y

y

[root@JNT2 tmp]#

yes 是可以秒殺的速度不斷重複某個字元,直到我按下 Ctrl+C 才中斷,或許這能用來提高處理器的使用率以進行某些目的的測試,但我看不出來 yes 5 | command 的目的在哪裡,誰來教教我啊!~~~



< 20090303補齊 >

6.expand



寫了一堆 Python 檔,用 tab 縮排,但竟發現而今型式是用四個空白而不是 tab !

沒問題,expand 命令可以把 tab 轉換成空白字元(space),在此選擇用四個空白鍵取代:



expand -4 uncoolscript.py > coolerscript.py



要從空白變成 tab,則可使用 unexpand 命令。

7.split



split 可以替你將檔案分割成串列,例如:



split -l 20 access_log part



此命令將分割 access_log 檔,每 20 行為一個檔案,切分後的各個檔案名稱由 part 起始。

【Nica 實作練習】

[root@JNT2 tmp]# split -l 20 rmduppkg part <= 分割 rmduppkg 這個檔為每 20 行一個檔,分割後的檔案從 part 這個名字開始。

[root@JNT2 tmp]# ll <= 查看分割後的檔案清單。

<略>

-rw-r--r-- 1 root   root    769 Mar  3 12:44 partaa

-rw-r--r-- 1 root   root    768 Mar  3 12:44 partab

-rw-r--r-- 1 root   root    786 Mar  3 12:44 partac

-rw-r--r-- 1 root   root    114 Mar  3 12:44 partad

-rw-r--r-- 1 root   root   2437 Feb 25 23:11 rmduppkg

srw------- 1 root   root      0 Jan 14 15:14 scim-panel-socket:0-root

[root@JNT2 tmp]# more partaa <==  查看其中一個分割後的檔案內容

yum remove audit-libs-1.6.5-9.el5.i386

yum remove bzip2-devel-1.0.3-4.el5_2.i386

yum remove bzip2-libs-1.0.3-4.el5_2.i386

yum remove cdparanoia-libs-alpha9.8-27.2.i386

yum remove compat-glibc-2.3.4-2.26.i386

yum remove cyrus-sasl-lib-2.1.22-4.i386

yum remove cyrus-sasl-plain-2.1.22-4.i386

yum remove expat-1.95.8-8.2.1.i386

yum remove expat-devel-1.95.8-8.2.1.i386

yum remove gettext-0.14.6-4.el5.i386

yum remove glibc-2.5-24.el5_2.2.i386

yum remove glibc-devel-2.5-24.el5_2.2.i386

yum remove gpm-1.20.1-74.1.i386

yum remove gpm-devel-1.20.1-74.1.i386

yum remove kudzu-devel-1.2.57.1.17-1.i386

yum remove libcap-1.10-26.i386

yum remove libcap-devel-1.10-26.i386

yum remove libdaemon-0.10-5.el5.i386

yum remove libgcrypt-1.2.3-1.i386

yum remove libgpg-error-1.4-2.i386

[root@JNT2 tmp]# wc -l partaa  <= 計算 partaa 檔案內容的行列數

20 partaa

8.uniq



你可能會有一個很長的項目清單檔,想要移除重複的行列,又或者你可能想把一些項目集結起來,標出它們重複的數字。



所以要移除所有重複行列:

uniq file.txt

你也可以使用其它命令的輸出:

cat file.txt | uniq

含括其重複的數量:

uniq -c file.txt



【Nica 實作練習】

[root@JNT2 tmp]# more rmduppkg  <= 查看 rmduppkg 檔,發現 pciutils-devel-2.2.3-5.i386 與 readline-devel-5.1-1.1.i386 皆為重複

<略>

yum remove pam_smb-1.1.7-7.2.1.i386

yum remove pciutils-devel-2.2.3-5.i386

yum remove pciutils-devel-2.2.3-5.i386

yum remove pciutils-devel-2.2.3-5.i386

yum remove pciutils-devel-2.2.3-5.i386

yum remove pciutils-devel-2.2.3-5.i386

yum remove pcsc-lite-devel-1.4.4-0.1.el5.i386

yum remove pcsc-lite-libs-1.4.4-0.1.el5.i386

yum remove popt-1.10.2-48.el5.i386

yum remove pygtk2-devel-2.10.1-12.el5.i386

yum remove python-devel-2.4.3-21.el5.i386

yum remove readline-5.1-1.1.i386

yum remove readline-devel-5.1-1.1.i386

yum remove readline-devel-5.1-1.1.i386

<略>

[root@JNT2 tmp]# uniq rmduppkg  <== 已清除重複部份

<略>

yum remove pam_smb-1.1.7-7.2.1.i386

yum remove pciutils-devel-2.2.3-5.i386

yum remove pcsc-lite-devel-1.4.4-0.1.el5.i386

yum remove pcsc-lite-libs-1.4.4-0.1.el5.i386

yum remove popt-1.10.2-48.el5.i386

yum remove pygtk2-devel-2.10.1-12.el5.i386

yum remove python-devel-2.4.3-21.el5.i386

yum remove readline-5.1-1.1.i386

yum remove readline-devel-5.1-1.1.i386

<略>

[root@JNT2 tmp]# uniq -c rmduppkg <== 計算出 pciutils-devel-2.2.3-5.i386 重複五次;readline-devel-5.1-1.1.i386 重複兩次。

<略>

1 yum remove pam_smb-1.1.7-7.2.1.i386

5 yum remove pciutils-devel-2.2.3-5.i386

1 yum remove pcsc-lite-devel-1.4.4-0.1.el5.i386

1 yum remove pcsc-lite-libs-1.4.4-0.1.el5.i386

1 yum remove popt-1.10.2-48.el5.i386

1 yum remove pygtk2-devel-2.10.1-12.el5.i386

1 yum remove python-devel-2.4.3-21.el5.i386

1 yum remove readline-5.1-1.1.i386

2 yum remove readline-devel-5.1-1.1.i386

<略>

1

[root@JNT2 tmp]#

9.wc



wc 可以用來計算字數、行列數與位元數。預設會三個都顯示:

wc ulyss12.txt



32758 267235 1561677 ulyss12.txt



[lines] [words] [bytes]



利用 -l 可以只顯示行列數:

wc -l ulyss12.txt

32758 ulyss12.txt



用 -w 可以只顯示字數:

wc -w ulyss12.txt

267235 ulyss12.txt

10.shred



rm - 移除命令、解除檔案鏈結,讓空間可以再利用。然而刪掉的檔案,有時只需要一點耐心與好運就可以救回來的。



我們最後要介紹的命令是 shred。shred 可重復覆寫檔案,令其難以回復。此功能對於個人財務資訊 - 像是信用卡資料的細節,格外有用:

shread -u mastercard.txt

你甚至可以將 shred 用在像分割區這樣的裝置上。若想完完全全清除家目錄分割區 - 也就是放在 /dev/sda6 下的這個,你可以這麼作:

shread /dev/sda6



要警告讀者的是:請注意我在第一個例子裡用了 -u,但第二個例子沒有。這是由於第一個要解除檔案鏈結 (例如: rm),但並非裝置 - 你會希望 /dev/sha6 清空,但是要存在。



現在來說一些較複較的狀況。首先,複雜的 RAID 建置可能會將此視為硬體問題,然後置換其中的資料。同樣地,有些公司行號的安裝方式,會與伺服器同步化這些檔案,Shred 將無法移除這類的複本。



最後,有些現下的日誌式檔案系統 - 例如 reiserfs 會將備份放在日誌裡,你必須以非日誌模式掛載該分割區,以利此動作完整執行。



這裡我們看完的十個命令,可能有一些是你沒有聽過的,我誠心希望其中至少有一樣能夠對你日常電腦作業有所幫助。



【Nica 實作練習】

shred 命令功能為:複寫檔案隱藏其內容,亦可選擇性刪除之。

其 -u 選項功能為:複寫後,截去並移除檔案。等同於 --remove,如果你要刪除的是檔案,就要加這個選項。



原文出處:

Ten Cool Coreutils Commands
arrow
arrow
    全站熱搜

    nicaliu 發表在 痞客邦 留言(0) 人氣()