今日の内容を手に入れようとしています"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
デフォルト名として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