Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:使用sed或awk读取文件场景中的行_Bash_Ubuntu 12.04_Shell_Sed_Awk - Fatal编程技术网

Bash:使用sed或awk读取文件场景中的行

Bash:使用sed或awk读取文件场景中的行,bash,ubuntu-12.04,shell,sed,awk,Bash,Ubuntu 12.04,Shell,Sed,Awk,我有以下几种情况: 文件内容: 10.1.1.1 10.1.1.2 10.1.1.3 10.1.1.4 我想要sed或awk,以便在每次返回新行时对文件进行cat 像 第一次迭代: cat ip | some magic 10.1.1.1 Second iteration returns 10.1.1.2 Third iteration returns 10.1.1.3 Fourth iteration returns 10.1.1.4 在n次迭代之后,它返回到第1行 第五次迭代返回:

我有以下几种情况:

文件内容:

10.1.1.1
10.1.1.2
10.1.1.3
10.1.1.4
我想要sed或awk,以便在每次返回新行时对文件进行cat

第一次迭代:

cat ip | some magic
10.1.1.1

Second iteration returns
10.1.1.2
Third iteration returns
 10.1.1.3
Fourth iteration returns
10.1.1.4
在n次迭代之后,它返回到第1行

第五次迭代返回:

10.1.1.1

我们可以用sed或awk来完成吗。

你不能用cat来完成。你也不能在管道上搜索,所以你不能使用管道

您可以使用嵌套的while循环来实现这一点

while ((1))
do
    while read line
    do
       echo "$line"
    done <somefile
done
while((1))
做
读行时
做
回音“$line”

完成您需要将行号存储在文件中,并在每次调用时用模数递增

get_line () {
    if [[ ! -e /var/local/get_line.next ]]
    then
        if [[ ! -e /var/local ]]
        then
            mkdir -p /var/local
        fi
        line_no=1
    else
        line_no=$(< /var/local/get_line.next)
    fi
    file_length=(wc -l < ip_file)
    if ((file_length == 0))
    then
        echo "Error: Data file is empty" >&2
        return 1
    fi
    if ((line > file_length))
    then
        line=1
    fi
    sed -n "$line_no{p;q}" ip_file
    echo "$((++line_no))" > /var/local/get_line.next
}
get_行(){
如果[!-e/var/local/get_line.next]]
然后
如果[!-e/var/local]]
然后
mkdir-p/var/local
fi
第1行
其他的
行号=$(&2
返回1
fi
如果((行>文件长度))
然后
直线=1
fi
sed-n“$line_no{p;q}”ip_文件
echo“$(++line_no))”>/var/local/get_line.next
}
这是一个函数的形式,您可以将其合并到脚本中。请随意更改get_line.next文件的位置。请注意,如果需要,读取或写入文件或创建目录的权限必须正确


您不需要使用
cat

是否有指定
sed
awk
的原因,或者是否可以接受另一种语言的解决方案?该解决方案以无限循环方式输出文件,相当于较短的
while((1));做一些档案;完成
。请注意,
while((1))
也可以写入
while true
while:
。你几乎应该总是把
-r
@denniswillamson一起作为一种教育<代码>While((1));做一些档案;done
与echo不太一样$file可以替换为do_something_有用,这符合OPs要求“在n次迭代后返回第1行”。