我正在编写一个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;
故障
我不介意是否有人可以调整代码,或建议完全不同的解决方案:)
答案 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。