Grep 与模式匹配的文本

Grep 与模式匹配的文本

我正在寻找一个命令,它将打印与条件匹配的行的选定部分。例如,我的文本行是这样的:

p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X

我想打印那些具有 的值Y。对于这个例子,预期的结果是p2,p6

答案1

在中使用Perl 兼容的正则表达式grep

grep -Po '..(?==Y)' <file

结果:

p2
p6

答案2

尝试这个:

echo 'p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X' | grep -o '[^|]*=Y' | cut -d= -f1 | sed -e 'N;s/\n/,/g'

输出:

p2,p6

答案3

awk可以根据您选择的正则表达式分隔符读取记录。例如,'[|\n]'
它还可以根据您选择的分隔符将记录拆分为字段。例如。'='
三元运算符(condition)?:可防止出现前导逗号。

awk -F= -vRS='[|\n]' '$2=="Y"{ printf (i?",":"")"%s", $1; i=1 }'

输出:

p2,p6

如果需要尾随换行符,可以将其附加到该END{}部分中。为了防止在没有匹配项时输出换行符,ORS可以将输出记录分隔符 ( ) 初始设置为没有任何,然后设置为\n是否找到匹配项。

awk -F= -vRS='|' -vORS= '$2=="Y"{printf (ORS?",":"")"%s", $1; ORS="\n"} END{print ""}'

答案4

一个简单的 awk

awk -F\| '{for (i=1 ; i<= NF; i++) 
    if ( $i ~/Y/ ) { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}}'

在哪里

  • -F\|用作|分隔符
  • {for (i=1 ; i<= NF; i++) 扫描图案
  • if ( $i ~/Y/ )如果找到
  • { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}拆分并打印

输出

in 3 : p2
in 11 : p6

用于printf "%s\n",A[1]跳过模式编号

相关内容