正確使用Unix操作系統(tǒng)
我們?cè)谖恼轮?,要介紹一些關(guān)于使用Unix操作系統(tǒng)中,需要養(yǎng)成的好習(xí)慣,這些習(xí)慣對(duì)我們使用Unix操作系統(tǒng)很有幫助。希望大家能夠好好的掌握。主要是關(guān)于匹配輸出中的某些字段,而不只是對(duì)行進(jìn)行匹配,舉出了好習(xí)慣和壞習(xí)慣,希望給大家一些借鑒。
Unix操作系統(tǒng)中匹配輸出中的某些字段,而不只是對(duì)行進(jìn)行匹配
當(dāng)您只希望匹配輸出行中特定字段 中的模式時(shí),諸如 awk 等工具要優(yōu)于 grep。下面經(jīng)過(guò)簡(jiǎn)化的示例演示了如何僅列出 12 月修改過(guò)的文件。
壞習(xí)慣 2 的示例:Unix操作系統(tǒng)使用 grep 來(lái)查找特定字段中的模式
~/tmp $ ls -l /tmp/a/b/c | grep Dec
-rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf
-rw-r--r-- 1 root root 238 Dec 03 08:19 README
-rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar
~/tmp $
在此示例中,grep 對(duì)行進(jìn)行篩選,并輸出其修改日期和名稱中帶 Dec 的所有文件。因此,諸如 December_Report.pdf 等文件是匹配的,即使它自從一月份以來(lái)還未修改過(guò)。這可能不是您希望的結(jié)果。為了匹配特定字段中的模式,最好使用 awk,其中的一個(gè)關(guān)系運(yùn)算符對(duì)確切的字段進(jìn)行匹配,如以下示例所示:
好習(xí)慣 1 的示例:使用 awk 來(lái)查找特定字段中的模式
- ~/tmp $ ls -l | awk '$6 == "Dec"'
- -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar
- -rw-r--r-- 1 root root 238 Dec 03 08:19 README
- ~/tmp $
Unix操作系統(tǒng)停止對(duì) cat 使用管道
grep 的一個(gè)常見(jiàn)的基本用法錯(cuò)誤是通過(guò)管道將 cat 的輸出發(fā)送到 grep 以搜索單個(gè)文件的內(nèi)容。這絕對(duì)是不必要的,純粹是浪費(fèi)時(shí)間,因?yàn)橹T如 grep 這樣的工具接受文件名作為參數(shù)。您根本不需要在這種情況下使用 cat,如以下示例所示:
好習(xí)慣和壞習(xí)慣 1 的示例:Unix操作系統(tǒng)使用帶和不帶 cat 的 grep
- ~ $ time cat tmp/a/longfile.txt | grep and
- 2811
- real 0m0.015s
- user 0m0.003s
- sys 0m0.013s
- ~ $ time grep and tmp/a/longfile.txt
- 2811
- real 0m0.010s
- user 0m0.006s
- sys 0m0.004s
- ~ $
此錯(cuò)誤存在于許多工具中。由于大多數(shù)工具都接受使用連字符 (-) 的標(biāo)準(zhǔn)輸入作為一個(gè)參數(shù),因此即使使用 cat 來(lái)分散 stdin 中的多個(gè)文件,參數(shù)也通常是無(wú)效的。僅當(dāng)您使用帶多個(gè)篩選選項(xiàng)之一的 cat 時(shí),才真正有必要在管道前首先執(zhí)行連接。
在Unix操作系統(tǒng)中我們需要養(yǎng)成很多好的習(xí)慣,希望大家能夠養(yǎng)成以上的好習(xí)慣,改掉自己的壞習(xí)慣。
【編輯推薦】