"grep -v "^.$"" 的作用是什麼

"grep -v "^.$"" 的作用是什麼

我有一個用於清理資料檔案的腳本

命令:

for i in `find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$" |grep data-`

我嘗試在沒有該功能的情況下運行該命令grep -v,但沒有發現任何差異。

我想知道它的grep -v "^.$"作用是什麼。我沒有創建這個腳本,而且我在網上找不到任何東西。

答案1

grep -v "^.$"將列印輸入中的所有行,除了那些只有單一字元的行。

因為它用於:

find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"

我們可以假設它是從的輸出中丟棄當前工作目錄(.) (使用相對路徑時顯示),這可以透過選項輕鬆實現,儘管這裡它是​​多餘的,因為您在 中使用絕對路徑。find.-mindepth 1find

稍後您只搜尋data-名稱中帶有 的文件grep data-,這也是多餘的。您可以將所有邏輯放在一次find呼叫中:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print

也刪除-print,這是預設操作:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15

請注意,如果您只查找文件,-type f也請新增:

find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15

答案2

正如其他人已經說過的,grep -v '^.$'過濾掉僅由一個字元組成的行(由行開頭 ( ^) 後跟一個字元 ( .) 後跟行結尾 ( $) 組成的行。另一種編寫方式是grep -vx .其中,-x使^$隱式(.整行匹配)。

關於輸出:

find /ddomain/data/shop12/ -mtime +15 -print

這沒有什麼意義,因為該命令的輸出find通常由以下行組成:

/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...

該輸出包含單一字元的行的唯一方法是如果存在名稱類似於foo<newline>X<newline>.這是完全有可能的,但我想說這不太可能是該命令的意圖。

該命令可能(錯誤地)改編自:

find . -mtime +15 -print | grep -v '^.$' | grep data-

grep目的是過濾掉.條目(即使如此,grep -Fvx .也會更合適)。然而,這樣寫會更有意義:

find . ! -name . -path '*data-*' -mtime +15

如果你想用 過濾掉頂級目錄find /ddomain/data/shop12/,你可以這樣做:

find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15

或者,如果您的find實作支援-mindepth謂詞:

find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15

答案3

.它從結果清單中刪除該目錄find。透過一個例子更容易解釋:

find . -print
.
./prova2
./prova2/prova2  

find . -print | grep -v '^.$'
./prova2
./prova2/prova2  

正如您所看到的,在第一個程式碼片段中,我們找到了.結果。因此,您將其傳遞給循環所採取的操作for。在第二個片段中,您決定從 的結果中
跳過該目錄,因此您不會將其發送到循環。.findfor

答案4

grep -v '^.$'排除只有一個字元的行。

例子:

echo "foo
> bar
> x" | grep -v '^.$'
foo
bar

相關內容