grepを使用して行末のファイル名を抽出するには?

grepを使用して行末のファイル名を抽出するには?

ls *.CCDディレクトリ出力の使用などの情報を含むログファイルがあります /var/tmp/Person

-rwxr-xr-x    1 bv90       dkas     153698  Nov 18 13:08 WE994002.CCD

私にはそんなセリフが多いです。

これにより、grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18"行全体が回復しますが、WE994002.CCDファイル名のみを印刷するようにコマンドを変更するにはどうすればよいですか?

答え1

最後の列を印刷します。

awk '{print $NF}' /var/tmp/k.log

または

grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18" | awk '{print $NF}'

答え2

awk ステートメントを追加して、次のようにリストを解析します。

grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18"| awk '{print $9}'

このawkステートメントは出力をスペースで区切って9番目のフィールドを印刷します。

この場合、grepを完全にスキップして次のように短縮できます。

awk '/.CCD$/ && /bv90/ && /Nov 18/ {print $9}' /var/tmp/k.log

答え3

GNU grepを使用している場合は、この-oオプションが関連している可能性があります。

$ echo '-rwxr-xr-x 1 bv90 dkas 153698 Nov 18 13:08 WE994002.CCD' | grep -o '[^ ]*\.CCD$'
WE994002.CCD

これは、フィルタリングするファイル名にスペースが含まれていないと仮定します。呼び出しでは、grep -o行末で終わる空白ではなく、文字シーケンスに一致する行部分のみを印刷する必要があります。.CCD完全なコマンドは次のとおりです。

</var/tmp/k.log grep bv90 | grep "Nov 18" | grep -o '[^ ]*\.CCD$'

答え4

ファイル名にスペースがなく、ソフトリンクがない場合は、Cyrusの説明に従ってAWKを使用します。

ファイル名にスペースが含まれている場合は、スペースを使用して前のすべてのフィールドを記述し、次のすべてのタグをキャプチャできます。

sed 's/\(\S\+\s\+\)\{8\}\(.*\)/\2/' logfile

最初の角かっこセットは列を記述し、その後にスペースが続きます。これを8回繰り返します。 2番目の角かっこセットは、逆参照\ 2によってキャプチャされた残りの行をキャプチャします。

ソフトリンクを削除する必要がある場合は、Casが言ったように別のsedコマンドが必要であると確信しています。

sed 's/\(\S\+\s\+\)\{8\}\(.*\)/\2/ ; s/ -> .*//'

関連情報