コマンド出力から文字列を検索して抽出する方法は?

コマンド出力から文字列を検索して抽出する方法は?

オペレーティングシステム:カーネル 2.6.x

便利:ビジボックス1.2xで

コマンドは複数行のテキストを出力します。

string1 text1: "asdfs asdf adfas"
string2 text2: "iojksdfa kdfj adsfj;"
string3 text3: "skidslk sadfj"
string4 text4: "lkpird sdfd"
string5 text5: "alskjfdsd safsd"

ターゲット:"text4:"(引用符を除く)を含む行を検索し、その文字列の後のすべての文字を行の最後まで抽出する必要があります。

希望の出力:"lkpird sdfd"(引用符を含む)

現在私は...

command | grep 'text4:' | awk -F': ' '{print $3}'

これを書くより簡単な方法はありますか?

答え1

sedを使う

$ command | sed -n 's/.*text4://p'
 "lkpird sdfd"

-n明示的に要求されない限り、印刷しないようにsedに指示します。 s/.*text4:// sedに、行の先頭から最後まですべてのテキスト項目を削除するように指示しますtext4:。そのような行が見つかると、psedはそれを印刷するように指示されます。

使用grep -P

$ command | grep -oP '(?<=text4:).*' 
 "lkpird sdfd"

-o一致する部分のみを印刷するようにgrepに指示します。以下を除く(?<=text4:).*すべてのテキストと一致します。text4:text4:

この-PオプションにはGNU grepが必要です。 したがって、busyboxの組み込みコマンドやgrepBSD / Mac OSXシステムの基本コマンドでは機能しません。grep

awkを使う

元のgrep-awkソリューションは、次のように単純化できます。

$ command | awk -F': ' '/text4: /{print $2}'
"lkpird sdfd"

awkを使用(代替)

$ command | awk '/text4:/{sub(/.*text4:/, ""); print}'
 "lkpird sdfd"

/text4:/含まれる行を選択しますtext4:sub(/.*text4:/, "")行の先頭から最後の項目まですべてのテキストを削除するようにawkに指示しますtext4:printawkにこの行を印刷するように指示してください。

答え2

PCREのサポートgrep\K通知。

command |grep -Po 'text4: \K.*'

関連情報