使用bash在文本文件中的每第四行执行命令

时间:2015-04-09 17:13:54

标签: bash

我正在尝试在文件的第2,6,10,14行执行grep命令,但这不太有用。看来我的if语句有错误。有什么想法吗?

count=0

while read p; do
    if [$count%4==2]
    then
        grep $p /dir/file.txt | wc -l >> output.txt
        (( count++ ))
    fi  
done < /dir/file.txt

最后,我希望这个脚本在output.txt中列出文件中重复第2行的次数,然后重复第6行的次数,以及10和14等。

4 个答案:

答案 0 :(得分:2)

这听起来像是awk的工具,您可以访问变量NR,它是当前正在处理的行的编号,例如,seq 14输出1到14之间的数字,每行一个:

$ seq 14 | awk '(NR+2) % 4==0'
2
6
10
14

答案 1 :(得分:1)

你的shell语法已被清除;你需要方括号内的空格;但模运算符不是[内置函数的一个特性,因此您需要进行几个不具吸引力的更改来修复它。

无论如何,使用Awk可以极大地简化这一过程。

awk -v pat="$p" '(NR % 4) == 2 && $0 ~ pat { ++count }
    END { print count }' /dir/file.txt

NR是当前行号,$0是当前输入行。 pat是您从shell变量$p传入的模式。

答案 2 :(得分:1)

Sed有跳线。使用它来获取您想要测试的行,然后grep结果。

$ sed -e "2,~4p" -e d <infile |grep $p

答案 3 :(得分:0)

首先grep在文件中工作。如果你想grep特定行中的模式,那么你可以这样做:

i=1; 
while read -r line;  
do 
   if [ $((i++ % 2)) -eq 0 ]; then
      echo "$line" | grep $p >> output.txt
   fi
done </dir/file.txt