0

使用存储一些数据的文件,我想读入这些文件并在其他文件中打印与模式匹配的 5 条特定行。但如果文件不正确,我想打印 5 行包含任何消息(例如“错误”),以区分并知道哪个文件好或不好。

这是我的做法:

if grep -q 'PATTERN' outputfile;
    then
     grep --color 'ANOTHER_PATTERN' outputfile > tmpfile
   else
     printf 'ERROR %.0s\n' {1..5} > tmpfile
fi

所以,我的问题是该命令如何printf 'ERROR %.0s\n' {1..5}真正起作用?代码实际上可以工作,但我不习惯使用我不完全理解的命令。

我知道%s用于打印字符串,\n用于换行,但我不知道为什么我们需要使用.0s. 我想在“错误”旁边打印一个空格而不是数字(1,2..,5)是一个“技巧”,因为如果我只是使用 %s\n {1..5}我会得到:

ERROR 1
ERROR 2 
...

依此类推,直到 5。我的第二个问题是:如何在ERROR不使用此消息的情况下打印 5 行消息?提前感谢您的任何提示。

4

2 回答 2

1

Printf 变量采用以下形式:

%[parameter$][flags][width][.precision][length]type
  • 精度:整数最小字符串长度,小数点后的最大浮点数,或字符串中的最大字符数。前缀.

因此.0s打印字符串的 0 个字符,省略它。

如果你真的想打印 5 次,最基本的方法是 for 循环

for i in {1..5}; do echo "ERROR"; done
于 2019-07-23T21:00:47.680 回答
1

如果接收到的参数多于格式指定的参数,则格式字符串将重复,直到没有更多参数为止。

{1..5}生成一个由 5 个整数参数组成的序列

您可以编写与以下结果相同的代码:

printf 'ERROR %.s\n' _ _ _ _ _ > tmpfile

或者使用重定向到 tmpfile 的显式循环

for i in _ _ _ _ _; do echo 'ERROR'; done >tmpfile

printf方法是最有效的,因为它只执行一条 Bash 语句,而不是使用 for 循环执行多条 Bash 语句。

请记住,Bash 没有 JIT 编译器,因此它每次都在循环中解析每个命令。

于 2019-07-23T21:15:51.577 回答