我正在寻找一个命令,它将打印与条件匹配的行的选定部分。例如,我的文本行是这样的:
p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X
我想打印那些具有 的值Y
。对于这个例子,预期的结果是p2,p6
。
答案1
在中使用P
erl 兼容的正则表达式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]
跳过模式编号