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
}
感谢
你可以试试这个:
#!/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()
的输出将被打印在控制台上,并且文件的修改内容将被重定向到文件。
值得注意的是,'print'语句中的重定向意味着由'system'执行的命令的标准输出转到标准输出('awk') - 这就是为什么你不执行shell-输出日志文件的级别重定向。这是你很好地编码的一个微妙点,但应该呼吁。您应该也可以声明,您不能/不要现场修改文件。 –
我需要在文件中逐行循环,我必须执行命令并将
我的帖子中显示的'awk'命令逐行读取文件,并使用'system()'调用执行命令,然后将第三个字段更改为“Processsed”。 – Fazlin
把''变成'Processed'之前,它的旧值是多少?除非它至少与新状态一样长(例如“未处理”),否则你不能在原地进行更改;较长的状态会覆盖文件下一行的内容。另外,读取一条线,寻找一条线,并在shell中写一行是非常困难的。所以,你写给'同一个文件'的大纲方法在shell中基本上是有致命缺陷的。这在C语言或类似的语言中会很棘手;如果长度条件满足,它可以完成,但它可能不是一个好主意。您应该将信息复制到新文件。 –
欢迎来到Stack Overflow!请[编辑]你的问题,以显示[你迄今为止所尝试的](http://whathaveyoutried.com)。您应该包含您遇到问题的代码[mcve],然后我们可以尝试帮助解决特定问题。你还应该阅读[问]。 –