繁体   English   中英

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

[英]Bash: How to read previous line while reading a file

我正在编写一个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的操作,因此在迭代时移至第三行。

样本输入文件:

idk:idk1-baf1:set接口ae0描述“ baf-> bel”

idk:idk1-baf1:set接口ae6描述“ baf-> bel”

idk:idk1-baf1:set接口ae6聚合醚选项最小链接4

idk:idk1-baf1:set接口ae12描述“ baf-> bel”

idk:idk1-baf4:set接口ae12聚合醚选项最小链接4

idk:idk1-baf4:set接口ae131聚合醚选项最小链接4

idk:idk1-baf4:set接口ae133聚合醚选项最小链接4

电流输出:

idk:idk1-baf1:set接口ae0描述“ baf-> bel”

失败

idk:idk1-baf1:set接口ae12描述“ baf-> bel”

失败

因此,当前输出基本上跳过了这一行:

idk:idk1-baf1:set接口ae6描述“ baf-> bel”

预期产量:

idk:idk1-baf1:set接口ae0描述“ baf-> bel”

失败

idk:idk1-baf1:set接口ae6描述“ baf-> bel”

成功

idk:idk1-baf1:set接口ae12描述“ baf-> bel”

失败

我不在乎是否有人可以调整代码,或提出完全不同的解决方案:)

你可以用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 /:将在当前行/行中搜索“ bel”字符串。

  • i = $ 1 $ 2 $ 3 :如果行/行中存在“ bel”,则它将当前行的前3列的值存储在变量i中。

  • j = 1 :将其视为标志。 如果行中出现“ bel”。 等于1。

  • print :如果存在“ bel”,则它将打印当前行/行。


现在来看另一个if语句。


  • if(j == 1) :检查j(即此处的标志)是否等于1。如果等于1,则表示前一行将“ bel”作为字符串。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM