如何剪切所有內容直到特定單字/在腳本中查找之後

如何剪切所有內容直到特定單字/在腳本中查找之後

我正在嘗試獲取今天包含"ERROR".

我用它來查找我想要的文件:

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
   -daystart -mtime -1 -exec grep -rl "ERROR" "{}" +

當前輸出(如果發現錯誤):

/home/user/logfilesError/gandalf_123.log

但我想要的輸出只是日誌檔名:

gandalf_123.log

資訊:路徑經常變化,所以我不能只剪下之前的字母。

感謝您的幫忙!

答案1

basename工具可以移除檔案名稱之前的路徑。

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 basename

會給你想要的輸出。

-n 1告訴xargs只使用一個參數作為基本名稱。因此,如果它收到更多,它將為basename每個參數產生一個進程。這是必需的,因為basename僅需要一個檔案名稱作為參數。

如果您的檔案名稱包含空格,此命令將無法運作。在這種情況下,按照@HaukeLaging的建議,使用:

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 -d \\n basename

但是,如果您的檔案名稱包含換行符,這將無法運作。

答案2

如果./gandalf_123.log適合您那麼您可以使用

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
  -daystart -mtime -1 -execdir grep -rl "ERROR" "{}" +

否則我會grep通過管道輸出,例如sed為了刪除不需要的部分:

> echo /home/user/logfilesError/gandalf_123.log |
  sed 's+.*/++'
gandalf_123.log

答案3

您可以使用sed

... | sed -e 's=.*/=='

這告訴它把 a 之前的任何內容替換/為空。

你也可以使用cut,但它不能從右邊開始計數,所以你必須將它與 結合rev

... | rev | cut -d/ -f1 | rev

答案4

這可以透過

 echo ${str##*/}

這將從左到右修剪字串,直到最後一個“/”

> str=/home/user/logfilesError/gandalf_123.log
> echo ${str##*/}
gandalf_123.log

相關內容