我有一个 log.txt 文件,其中包含多行字符串和信息。
我想编写一个脚本来逐行读取 log.txt 文件,并且任何包含单词 debug 的行我想将该行放入名为 debug.txt 的新文件中,所有其他行应转到 info.txt。
这样做的最佳方法是什么?我尝试做一个 while 循环但无法弄清楚。谢谢
答案1
有无数种方法可以做到这一点,我使用的前两个是 awk 和 grep (按顺序)
awk
awk '/debug/ { print > "debug.txt" ; next ;} { print } ' logfile > info.txt
在哪里
/debug
/ 选择带有单词 debug 的行{ print > "debug.txt" ;
打印到debug.txtnext ;}
读取日志文件中的下一行{ print }
如果没有调试,则打印到标准输出> info.txt
将标准输出重定向到 info.txt
更正式的命令
awk '/debug/ { print > "debug.txt" ; }
$0 !~ /debug/ { print > "info.txt " ; } ' logfile
在哪里
$0 !~ /debug/
意思是,如果debug不出现就行了。
grep
grep debug logfile > debug.txt
grep -v debug logfile > info.txt
在哪里
grep debug
选择带有调试的行grep -v debug
选择不调试的行- 日志文件被读取两次
>
另请注意,使用保留、>>
在 shell 或 awk 中使用时,debug.txt 和 info.txt 的先前内容将被删除。
答案2
这是bash
完成这项工作的脚本:
while IFS= read -r line; do
if [[ $line =~ debug ]]; then
echo "$line" >>debug.txt
else
echo "$line" >>info.txt
fi
done <log.txt