shell脚本,用于在unix中逐行读取文件并更新文件中的行

shell脚本,用于在unix中逐行读取文件并更新文件中的行,shell,unix,Shell,Unix,我有一个由java代码编写的日志文件,如下所示 <date>|<command>|<Error> <date>|<command>|<Error> <date>|<command>|<Error> <date>|<command>|<Error> 谢谢你可以试试这个: #!/bin/bash awk -F"|" 'BEGIN{ OFS="|"}{

我有一个由java代码编写的日志文件,如下所示

<date>|<command>|<Error>
<date>|<command>|<Error>
<date>|<command>|<Error>
<date>|<command>|<Error>
谢谢你可以试试这个:

#!/bin/bash
awk -F"|" 'BEGIN{ OFS="|"}{
  if ($3 ~ "Error"){
    system($2);
    $3="Processed";
  }
  print $0 > "/tmp/logfile.new";
}' logfile
mv /tmp/logfile.new logfile
  • awk的
    system()
    将执行第二个命令 如果第三个字段的状态为“错误”,则字段(由
    |
    分隔)
  • 然后第三个字段标记为“已处理”
  • 最后一行使用
    mv
    命令将创建的新文件移动到 原始输入文件
  • 正如我在帖子的评论中指出的,应该注意的是,
    system()
    的输出将打印在控制台上,修改后的文件内容将重定向到该文件
您可以尝试以下方法:

#!/bin/bash
awk -F"|" 'BEGIN{ OFS="|"}{
  if ($3 ~ "Error"){
    system($2);
    $3="Processed";
  }
  print $0 > "/tmp/logfile.new";
}' logfile
mv /tmp/logfile.new logfile
  • awk的
    system()
    将执行第二个命令 如果第三个字段的状态为“错误”,则字段(由
    |
    分隔)
  • 然后第三个字段标记为“已处理”
  • 最后一行使用
    mv
    命令将创建的新文件移动到 原始输入文件
  • 正如我在帖子的评论中指出的,应该注意的是,
    system()
    的输出将打印在控制台上,修改后的文件内容将重定向到该文件

在将
更改为
已处理之前,
的旧值是多少?除非它至少与新状态一样长(例如,
未处理
),否则您不能在原地进行更改;较长的状态将覆盖文件下一行的材料。另外,在shell中读一行、查找一行和写一行都非常困难。所以,在shell中,您编写“同一文件”的大纲方法本质上存在致命缺陷。用C语言或类似的语言会很棘手;如果满足长度条件,可以这样做,但这可能不是一个好主意。您应该将信息复制到新文件中。欢迎使用堆栈溢出!请出示你的问题。你应该包括一个你有问题的代码,然后我们可以尝试帮助解决具体的问题。你也应该读。| | | | | | | |这里我需要逐行读获取命令并执行更新同一日志文件中已处理的错误。将
更改为
Processed
之前,
的旧值是多少?除非它至少与新状态一样长(例如,
未处理
),否则您不能在原地进行更改;较长的状态将覆盖文件下一行的材料。另外,在shell中读一行、查找一行和写一行都非常困难。所以,在shell中,您编写“同一文件”的大纲方法本质上存在致命缺陷。用C语言或类似的语言会很棘手;如果满足长度条件,可以这样做,但这可能不是一个好主意。您应该将信息复制到新文件中。欢迎使用堆栈溢出!请出示你的问题。你应该包括一个你有问题的代码,然后我们可以尝试帮助解决具体的问题。你也应该读。| | | | | | | |这里我需要逐行读获取命令并执行更新同一日志文件中处理的错误。可能值得注意的是,
print
语句中的重定向意味着
系统执行的命令的标准输出转到标准输出(关于awk
)-这就是为什么你不做输出日志文件的shell级重定向。这是一个微妙的点,你做得很好,但应该调用。你可能还应该声明你不能/不在原地修改文件。我需要逐行循环文件,我必须执行一个命令并将状态替换为。我的疑问在这里如何在looop中逐行替换字符串。我的帖子中显示的
awk
命令逐行读取文件,并使用
system()
调用执行命令,然后将第三个字段更改为“Processsed”。已处理的行是否将替换正在“处理”的现有行或者它会创建另一行(重复行)在原始日志文件中?。如果您运行整个脚本,它将替换现有行。您可以尝试运行脚本以查看其工作方式,如果它不适合您,请告诉我们您的期望中缺少了什么。可能值得注意的是,
print
语句中的重定向意味着命令的标准输出由
系统执行的ds
转到标准输出(awk的
-这就是为什么你不做输出日志文件的shell级重定向。这是一个微妙的点,你做得很好,但应该调用。你可能还应该声明你不能/不在原地修改文件。我需要逐行循环文件,我必须执行一个命令并将状态替换为。我的疑问在这里如何在looop中逐行替换字符串。我的帖子中显示的
awk
命令逐行读取文件,并使用
system()
调用执行命令,然后将第三个字段更改为“Processsed”。已处理的行是否将替换正在“处理”的现有行还是会创建另一行(重复行)