如何在UNIX中逐行输入输入,在每一行上执行命令,并立即返回输出?

时间:2013-06-21 15:39:25

标签: shell unix

我正在尝试做一些非常简单的事情,但是按照我想要的方式解决它也会帮助我处理许多其他命令。

我想在UNIX中逐行读取文件并对它们执行命令,在本例中为字符计数。对于整个文件,我只会使用:

wc -m

但是,我想要每行输入。什么是逐行流式传输文件以便UNIX命令操作的最简单,最短的方法?我问,因为在这种情况下我想要每行wc -m,但未来的应用程序将使用完全不同的命令。

另外,我想避免使用perl和awk!我已经知道如何使用这些工具,但我正在寻找替代方法。

谢谢!

编辑:感谢您对其他问题的链接,但在查看了他们的4个答案后,我没有看到解决我的确切困境的问题。

给出以下输入:

cat test.txt
    This is the first line.
    This is the second, longer line.
    This is short.
    My Final line that is much longer than the first couple of lines.

我希望通过一些代码来插入它,这些代码将逐行读取并在每一行上执行命令,并立即返回结果。

某些代码在每一行上执行wc -m并返回输出:

23
32
14
65

或者某些代码在每一行上执行cut -d " " -f 1并返回输出:

This
This
This
My

希望这会让事情变得更加清晰。再次感谢您的任何建议!

2 个答案:

答案 0 :(得分:5)

您可以使用echo "${#line}"来了解字符串的长度。用while read...读取文件将完成剩下的工作:

$ cat file
hello
my name
is fedor
qui


$ while read line; do echo "${#line}"; done < file
5
7
8
3
0

以更好的格式:

while read line
do
   echo "${#line}"
done < file

答案 1 :(得分:1)

逐行处理的最佳选择是while read循环,尽管用于准确保留行的惯用语是:

while IFS= read -r line; do
    # process "$line"
done

未能使用IFS=将丢失前导空格。不使用read -r意味着一些反斜杠序列将被bash解释,而不是逐字逐句地保存在变量中。

我认为你的quandry可以重申:

  

我有一行文字。我如何将其视为文件?

bash有2个功能可以回答

  1. 对于可从stdin读取的wc等命令,请使用here-string

    wc -m <<< "$line"
    
  2. 对于需要文件的命令(我无法想到一个文件),请使用process substitution

    wc -m <(echo "$line")
    
  3. 示例:

    $ line="foo bar baz"
    $ wc -m <<<"$line"
    12
    $ wc -m <(echo "$line")
    12 /dev/fd/63
    

    P.S。 我注意到char计数包括隐式尾随换行符。要删除它,请在格式字符串

    中使用printf而不使用换行符
    $ wc -m <(printf %s "$line")
    11 /dev/fd/63
    $ wc -m < <(printf %s "$line")
    11