Shell awk:在特定图案后匹配图案,并在图案旁边打印文字

Shell awk:在特定图案后匹配图案,并在图案旁边打印文字,shell,unix,awk,Shell,Unix,Awk,我需要匹配一些模式,如果匹配的话,我需要打印接下来的几个单词。。我只有三个这样的条件要匹配…但我只需要打印满足第一个条件后的单词。。iez 虽然在LLL SSS之前我有TTT,但我只需要将LLL SSS之后的TTT打印到AAA RRR,而且当我遇到LLL SSS时,我也需要这样做,我尝试声明了一个awk标志变量,但它似乎不起作用。请帮帮我 var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR"; awk -v flag=1 '{ for (m

我需要匹配一些模式,如果匹配的话,我需要打印接下来的几个单词。。我只有三个这样的条件要匹配…但我只需要打印满足第一个条件后的单词。。iez

虽然在LLL SSS之前我有TTT,但我只需要将LLL SSS之后的TTT打印到AAA RRR,而且当我遇到LLL SSS时,我也需要这样做,我尝试声明了一个awk标志变量,但它似乎不起作用。请帮帮我

var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";
awk -v flag=1 '{
for (m=1;m<=NF;m++)
if($m~m/'$var1'/ && $(m+1)~/'$var2'/)
print "ABCD: ", $(m+2),$(m+3),$(m+4)
{flag=0};
else {
if {flag==0 && $m~/'var3'/)
print "EFG : ", $(m+1);
else { 
if (flag==0 && $m~/'$var4'/ && $(m+1)~/'var5'/)
print "HIJ: ",$(m+2),$(m+3) 
{flag=1}; 
}
}
}
}' fliename 

当您有多个嵌套的
时,如果像这样,使用大括号使其完全明确是非常重要的。我试图重写你的代码

  • 使用
    -v
    将shell变量传递到awk中,而不是使用引号
  • 空白是你的朋友——或者更确切地说,它是下一个必须维护你的代码的人的朋友
  • 修复了脚本第8行的几个错误
var1=“LLL”;var2=“SSS”;var3=“TTT”;var4=“AAA”;var5=“RRR”;
awk-v标志=1\
-v var1=“$var1”\
-v var2=“$var2”\
-v var3=“$var3”\
-v var4=“$var4”\
-v var5=“$var5”\
'{

对于(m=1;mGlenn的版本改进了一点。我否定了
flag
,因此可以跳过初始化

var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";
awk -v var1="$var1" -v var2="$var2" -v var3="$var3" -v var4="$var4" -v var5="$var5" \
'!flag {
    for (m=1; m<=NF-1; ++m) 
        if ($m == var1 && $(m+1) == var2) {
            print "ABCD: ", $(m+2),$(m+3),$(m+4)
            flag=1
            next
        }
 }
 flag {
    for (m=1; m<=NF-1; ++m) 
        if ($m == var3) {
            print "EFG : ", $(m+1)
            break
        } else {
            if ($m == var4 && $(m+1) == var5) {
                print "HIJ: ",$(m+2),$(m+3)
                flag=0
                break
            }
        }
}' filename
或者您甚至可以尝试纯bash版本:

var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";

found=0;
while read -a a; do
  if [ $found -eq 0 ]; then
    for((i=0;((i+1))<${#a[*]};++i)) {
      [ ${a[$i]} == $var1 -a ${a[((i+1))]} == $var2 ] &&
        echo ABCD: ${a[((i+2))]} ${a[((i+3))]} ${a[((i+4))]} &&
        found=1 && break
    }
  else
    for((i=0;((i+1))<${#a[*]};++i)) {
      [ ${a[$i]} == $var3 ] && echo EFG: ${a[((i+1))]} && break
      [ ${a[$i]} == $var4 -a ${a[((i+1))]} == $var5 ] && found=0 &&
        echo HIJ:  ${a[((i+2))]} ${a[((i+3))]} && break
    }
  fi
done <filename
var1=“LLL”var2=“SSS”var3=“TTT”var4=“AAA”var5=“RRR”;
发现=0;
边读边做
如果[$FOND-等式0];则

对于((i=0;((i+1))您期望的输出是什么?有一个名为
的标志
就像有一个孩子,并给它命名为
孩子
。来吧……还有一些缩进怎么样?而且,您的代码语法没有太多意义。甚至很难编辑。如果您想将字段与标记匹配,不需要使用正则表达式。在这种情况下,它太不准确了。Also您可以使用
ENVIRON[“var1”]
hash读取awk中的环境变量。您可以测试一个字段匹配,如
if($m==ENVIRON[“var1”]))
@glennjackman:你说得对!或者打电话给
var1=LLL var2=SSS awk'.'
+1因为
空白是你的朋友——或者更确切地说,它是下一个家伙的朋友,他必须在for循环中维护你的代码,最大值是
NF-1
。如果写非空信息真的很重要,那么
NR-4
@user2428250:我添加了一个纯
bash
解决方案。
var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";
awk -v var1="$var1" -v var2="$var2" -v var3="$var3" -v var4="$var4" -v var5="$var5" \
'!flag {
    for (m=1; m<=NF-1; ++m) 
        if ($m == var1 && $(m+1) == var2) {
            print "ABCD: ", $(m+2),$(m+3),$(m+4)
            flag=1
            next
        }
 }
 flag {
    for (m=1; m<=NF-1; ++m) 
        if ($m == var3) {
            print "EFG : ", $(m+1)
            break
        } else {
            if ($m == var4 && $(m+1) == var5) {
                print "HIJ: ",$(m+2),$(m+3)
                flag=0
                break
            }
        }
}' filename
ABCD:  A B C
EFG :  EFG
HIJ:  J K
ABCD:  E H G
EFG :  EFG
HIJ:  J K
var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";

found=0;
while read -a a; do
  if [ $found -eq 0 ]; then
    for((i=0;((i+1))<${#a[*]};++i)) {
      [ ${a[$i]} == $var1 -a ${a[((i+1))]} == $var2 ] &&
        echo ABCD: ${a[((i+2))]} ${a[((i+3))]} ${a[((i+4))]} &&
        found=1 && break
    }
  else
    for((i=0;((i+1))<${#a[*]};++i)) {
      [ ${a[$i]} == $var3 ] && echo EFG: ${a[((i+1))]} && break
      [ ${a[$i]} == $var4 -a ${a[((i+1))]} == $var5 ] && found=0 &&
        echo HIJ:  ${a[((i+2))]} ${a[((i+3))]} && break
    }
  fi
done <filename