如果第一个单词是 $var 则打印除前两个单词之外的整行

如果第一个单词是 $var 则打印除前两个单词之外的整行

我有一个如下所示的日志文件。

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,则打印除前两个单词之外的所有单词。

因此,在这种情况下,输出将是:

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

到目前为止我已经尝试过grep -oP "(?<=$var \d+ ).*$'"但它给出了错误grep: lookbehind assertion is not fixed length

我怎样才能做到这一点?

答案1

用这个简短的awksub就像sed,替换模式或正则表达式):

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

相关内容