多くのログファイルからいくつかのIDを取得するためにシェルでgrepを実行します。
grep "100200300" my.log*
結果は次のとおりです。
my.log:Jan 17 15:04:52 100200300 ok
my.log.1:Jan 17 14:35:17 100200300 failed
今、出力からファイル名を削除したいと思います。それでは、「:」が最初に表示されたときにこのテキストを分割して2番目の部分を出力するにはどうすればよいですか?
答え1
Steeldriverが述べたように、好ましい方法は-h
(--no-filename
)オプションを使用することです。実装にgrep
このオプションが含まれていない場合は、出力を使用またはsed
変更cut
できます。
grep [OPTIONS] PATTERN [FILE...] | sed 's/[^:]*://'
grep [OPTIONS] PATTERN [FILE...] | cut -d : -f 2-
ただし、この回避策はコロン()を含むファイル名を破損するため、普遍的ではありません:
。
答え2
これにより、この質問の件名で必要な操作が実行されます。 「区切り文字が最初に表示されたときの文字列の分割」
#!/bin/bash
while read -r line; do
[[ $line =~ :(.*) ]] && echo "${BASH_REMATCH[1]}"
done <<<"$(grep "100200300" my.log*)"
しかし、私はあなたに必要なものが次のとおりです。
grep -h "100200300" my.log*
この-h
オプションを使用すると、ファイルの内容がいいえファイル名:
Jan 17 15:04:52 100200300 ok
Jan 17 14:35:17 100200300 failed
答え3
次の手順を実行してファイル名を削除することもできます。
cat my.log* | grep "100200300"