
我剛剛在 awk 中遇到了一個問題,我想知道是否有人可以向我解釋為什麼會發生這種情況。
如果我運行,以下兩行的行為會有所不同:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" '{print $1}'
我(如預期)只得到包含 BASE_DIR 的檔案路徑的第一個目錄。
但是,如果我像這樣運行它:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F="/" "{print $1}"
編輯:
-F="/"
並且-F "/"
不會影響我的測試。第二個命令已更新以顯示這一點
正如格倫傑克曼在答案中所建議的那樣,我將命令更改為:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
並且得到了完全相同的有缺陷的結果
編輯結束
我獲得了包含 BASE_DIR 的文件的完整路徑,我嘗試轉義程序文本,以防萬一"{print \$1}"
這是問題所在,但我得到了相同的結果。
有人能告訴我這裡的問題是什麼嗎?
答案1
在第一個範例中,您正在執行以下操作:awk -F "/"
在下一個範例中,您正在執行下列操作:awk -F="/"
所以字段分隔符是不同的:您使用兩個字串=/
作為字段分隔符
啊,我不知道為什麼我之前沒有看到這個:你使用了錯誤的引號:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
------------------------------------------------------^
awk 程式兩邊的雙引號表示 shell 將會取代該變數$1
前將程序交給 awk。在 shell 中很可能$1
是空的,因此 awk 會看到:{print }
請改用單引號。