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

问题描述:

我有一个由下面的java代码编写的日志文件。shell脚本在unix中逐行读取文件并更新文件中的行

<date>|<command>|<Error> 
<date>|<command>|<Error> 
<date>|<command>|<Error> 
<date>|<command>|<Error> 

我需要从线行至编写一个脚本来回路线路和执行命令,并更新在同一个文件中的行=“加工”的状态中。

AutoTrigger() 
{ 

echo "`date`: Checking the status of the files . Please wait..." 

if [[ -s /tmp/samplefilelog.log ]] ; then 

cat /tmp/samplefilelog.log | while read LINE 
do 
echo "LINE:" $LINE 
LINE1=`echo $LINE | grep -v Processed` 
echo "LINE1:" $LINE1 
Command=`echo $LINE1 | cut -d "|" -f3` 
echo "command:" $Command 
$Command >> /tmp/Processinglogs.txt 
printf $LINE | awk 'BEGIN{FS=OFS="|"}{$4="Processed";print}' 

cat /tmp/samplefilelog.log 
done 
fi 

} 

感谢

+2

把''变成'Processed'之前,它的旧值是多少?除非它至少与新状态一样长(例如“未处理”),否则你不能在原地进行更改;较长的状态会覆盖文件下一行的内容。另外,读取一条线,寻找一条线,并在shell中写一行是非常困难的。所以,你写给'同一个文件'的大纲方法在shell中基本上是有致命缺陷的。这在C语言或类似的语言中会很棘手;如果长度条件满足,它可以完成,但它可能不是一个好主意。您应该将信息复制到新文件。 –

+2

欢迎来到Stack Overflow!请[编辑]你的问题,以显示[你迄今为止所尝试的](http://whathaveyoutried.com)。您应该包含您遇到问题的代码[mcve],然后我们可以尝试帮助解决特定问题。你还应该阅读[问]。 –

+0

| | | | | | 在这里,我需要逐行阅读获取命令并执行更新错误 - 在同一个日志文件中处理。 –

你可以试试这个:

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

值得注意的是,'print'语句中的重定向意味着由'system'执行的命令的标准输出转到标准输出('awk') - 这就是为什么你不执行shell-输出日志文件的级别重定向。这是你很好地编码的一个微妙点,但应该呼吁。您应该也可以声明,您不能/不要现场修改文件。 –

+0

我需要在文件中逐行循环,我必须执行命令并将状态替换为。我的疑问是,我们怎样才能在循环中逐行替换字符串。 –

+0

我的帖子中显示的'awk'命令逐行读取文件,并使用'system()'调用执行命令,然后将第三个字段更改为“Processsed”。 – Fazlin