特定の単語まで/スクリプトで見つけた後にすべてを切り取る方法

特定の単語まで/スクリプトで見つけた後にすべてを切り取る方法

今日の内容を手に入れようとしています"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 1xargsデフォルト名として1つの引数のみを使用するように指示します。したがって、より多くを受信すると、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

関連情報