我正在嘗試獲取今天包含"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