最初の単語が$ varの場合、最初の2つの単語を除く行全体を印刷します。

最初の単語が$ varの場合、最初の2つの単語を除く行全体を印刷します。

以下のログファイルがあります。

130023432 195047 /media/ismail/SSDWorking/book-collection/_Books/book 1.epub
130023433 195047 /media/ismail/SSDWorking/book-collection/_Books/book 2.epub
130023431 195047 /media/ismail/SSDWorking/book-collection/_Books/book 3.epub

変数がありますが、var=130023432

$var最初の単語が次の場合、最初の2つの単語を除くすべての単語を印刷したいと思います。

したがって、この場合の出力は次のようになります。

/media/ismail/SSDWorking/book-collection/_Books/book 2.epub

これまで試しましたが、grep -oP "(?<=$var \d+ ).*$'"エラーが発生しました。grep: lookbehind assertion is not fixed length

どうすればいいですか?

答え1

次の短いawksubsed:代替パターンまたは正規表現)を使用してください。

var=130023432 awk -v var="$var" '$1==var{sub($1" "$2" ", ""); print}' file

または簡単に:

awk -v var="130023432" '$1==var{sub($1" "$2" ", ""); print}' file

/media/ismail/SSDWorking/book-collection/_Books/book 1.epub

答え2

awkこの目的に使用できます。

var="$var" awk '$1 == ENVIRON["var"] { $1 = $2 = ""; print substr($0, 3) }' logfile

出力例の使用

/media/ismail/SSDWorking/book-collection/_Books/book 1.epub

環境変数は、変更されていない状態でバックスラッシュなどの値が処理されるawk -v var="$var" '...'}ため、その構成を回避しました。-v本当にこの道を行きたいなら、次のことを試してみてください(POSIXではありません)。

awk -v var="${var//\\/\\\\}" '$1 == var { $1 = $2 = ""; print substr($0, 3) }' logfile

答え3

sed

$ sed -En "s~$var[^/]*(.*)~\1~p" input_file

pcregrep

$ pcregrep -o1 "$var[^/]*(.*)" input_file

grep

$ grep -oP "$var[^/]*\K.*" input_file

awk

$ awk -v var="$var" '$1==var {print $(NF-1),$NF}' input_file

出力

/media/ismail/SSDWorking/book-collection/_Books/book 1.epub

関連情報