我們在文章中,要介紹一些關於使用Unix操作系統中,需要養成的好習慣,這些習慣對我們使用Unix操作系統很有幫助。希望大家能夠好好的掌握。主要是關於匹配輸出中的某些字段,而不只是對行進行匹配,舉出了好習慣和壞習慣,希望給大家一些借鑒。
Unix操作系統中匹配輸出中的某些字段,而不只是對行進行匹配
當您只希望匹配輸出行中特定字段 中的模式時,諸如 awk 等工具要優於 grep。下面經過簡化的示例演示了如何僅列出 12 月修改過的文件。
壞習慣 2 的示例:Unix操作系統使用 grep 來查找特定字段中的模式
~/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 對行進行篩選,並輸出其修改日期和名稱中帶 Dec 的所有文件。因此,諸如 December_Report.pdf 等文件是匹配的,即使它自從一月份以來還未修改過。這可能不是您希望的結果。為了匹配特定字段中的模式,最好使用 awk,其中的一個關系運算符對確切的字段進行匹配,如以下示例所示:
好習慣 1 的示例:使用 awk 來查找特定字段中的模式
- ~/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操作系統停止對 cat 使用管道
grep 的一個常見的基本用法錯誤是通過管道將 cat 的輸出發送到 grep 以搜索單個文件的內容。這絕對是不必要的,純粹是浪費時間,因為諸如 grep 這樣的工具接受文件名作為參數。您根本不需要在這種情況下使用 cat,如以下示例所示:
好習慣和壞習慣 1 的示例:Unix操作系統使用帶和不帶 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
- ~ $
此錯誤存在於許多工具中。由於大多數工具都接受使用連字符 (-) 的標准輸入作為一個參數,因此即使使用 cat 來分散 stdin 中的多個文件,參數也通常是無效的。僅當您使用帶多個篩選選項之一的 cat 時,才真正有必要在管道前首先執行連接。
在Unix操作系統中我們需要養成很多好的習慣,希望大家能夠養成以上的好習慣,改掉自己的壞習慣。