awk

awk

我有一个 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.txt
  • next ;}读取日志文件中的下一行
  • { 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

相关内容