譯者: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