Bash:如何在读取文件时读取上一行

时间:2017-09-06 10:13:25

标签: linux bash

我正在编写一个bash脚本,该脚本应该读取具有某些设备配置行的文件。我们的想法是从文件中读取和打印一行。如果' bel'在当前行中找到,然后检查下一行是否有关键字X是" awk' {print $ 3}'"当前行。如果在当前行中找不到keywordA,请转到下一行并继续搜索' bel'。

如果第二行有关键字X,则打印成功,否则打印失败。无需打印第二行本身。然而,这是我无法弄清楚的部分,如果第二行没有keywordB并且打印失败,那么重新搜索此行以获得keywordA并且基本上再次使用该逻辑。

以下是我的想法:

#! /bin/bash
Input="/tmp/temp2"
while read LINE
do
    if $(echo "$LINE" | grep -q bel)
    then
        echo "$LINE"
        intf=`echo $LINE | awk  '{print $1" "$2" "$3}'`
        echo $intf
        read LINE
        if $(echo "$LINE" | grep -q "$intf " )
        then
            echo "Success"
        else
            echo "Fail"
        fi
    fi
done < "$Input" > /tmp/temp3

基本上,我只是想让它重新阅读第二行并搜索keywordA。但是,当代码在循环内部执行读取LINE时,它会在迭代时移动到第3行。

示例输入文件:

  

idk:idk1-baf1:设置接口ae0 description&#34; baf - &gt; BEL&#34;

     

idk:idk1-baf1:设置接口ae6 description&#34; baf - &gt; BEL&#34;

     

idk:idk1-baf1:设置接口ae6 aggregated-ether-options minimum-links 4

     

idk:idk1-baf1:设置接口ae12 description&#34; baf - &gt; BEL&#34;

     

idk:idk1-baf4:设置接口ae12 aggregated-ether-options minimum-links 4

     

idk:idk1-baf4:设置接口ae131 aggregated-ether-options minimum-links 4

     

idk:idk1-baf4:设置接口ae133 aggregated-ether-options minimum-links 4

当前输出:

  

idk:idk1-baf1:设置接口ae0 description&#34; baf - &gt; BEL&#34;

故障

  

idk:idk1-baf1:设置接口ae12 description&#34; baf - &gt; BEL&#34;

故障

所以当前的输出基本上是在跳过这条线:

  

idk:idk1-baf1:设置接口ae6 description&#34; baf - &gt; BEL&#34;

预期产出:

  

idk:idk1-baf1:设置接口ae0 description&#34; baf - &gt; BEL&#34;

故障

  

idk:idk1-baf1:设置接口ae6 description&#34; baf - &gt; BEL&#34;

成功

  

idk:idk1-baf1:设置接口ae12 description&#34; baf - &gt; BEL&#34;

故障

我不介意是否有人可以调整代码,或建议完全不同的解决方案:)

1 个答案:

答案 0 :(得分:1)

您可以使用awk

awk '{if(j==1){if(i==$1$2$3){print "success"}else{print "fail"}j=0} if($0 ~ /bel/){i=$1$2$3;j=1;print} }' file

它将打印:

idk:idk1-baf1:set interfaces ae0 description "baf -> bel"
fail
idk:idk1-baf1:set interfaces ae6 description "baf -> bel"
success
idk:idk1-baf1:set interfaces ae12 description "baf -> bel"
fail

<强>解释

  
      
  • 默认情况下,awk会将空格作为输入字段分隔符。

  •   
  • $ 0 :代表当前行/行。

  •   
  • $ 1 :代表当前行/行的第一列。

  •   
  • $ 2 :代表当前行/行的第二列。

         

    ....等等。

  •   
  • $ 0~ / bel /:会搜索&#34; bel&#34;当前行/行中的字符串。

  •   
  • i = $ 1 $ 2 $ 3 :如果&#34; bel&#34;在行/行中存在然后它将在变量i中存储当前行的前3列的值。

  •   
  • j = 1 :将此视为标志。如果&#34;贝尔&#34;在线。它将等于1.

  •   
  • 打印:如果&#34; bel&#34;如果存在则会打印当前行/行。

  •   

现在来到另一个 if 语句。

  
      
  • if(j == 1):检查j(即此处的标志)是否等于1.如果它等于1则表示前一行有&#34 ; BEL&#34;作为字符串。

  •   
  • if(i == $ 1 $ 2 $ 3){print&#34; success&#34;} else {print&#34; fail&#34;} j = 0 :这里它是将i(存储在前一行的第3列)与当前行的第3列进行比较。如果匹配则会打印成功&#34;否则将打印失败,它将设置j = 0。

  •