如何从日志文件中提取特定值并将其传输到另一个文件

如何从日志文件中提取特定值并将其传输到另一个文件

我有一个日志文件,如下所示:

########### mv90_poll.sh started Wed Sep 23 02:36:00 PDT 2015 ############

/usr/mv90/mv90/system/*.di not found
list *.HHF files in /usr/mv90/fats
-rw-------   1 cdas       cdas             6 Jan 12  2015 MO994001.HHF
-rw-------   1 cdas       cdas        189440 Jan 12  2015 MO994002.HHF
-rw-rw-r--   1 samalrr    cdas         12800 Sep 22 13:30 TU994001.HHF

我想知道如何编写一个脚本,将所有.HHF文件提取到另一个文件中,可能是 Excel 格式。

答案1

使用grep

grep -oP '[A-Z]{2}[0-9]{6}\.HHF$' file >newfile

我假设这些.HHF文件的名称以 2 个大写字符 ( [A-z{2}]) 开头,然后是 6 个数字 ( [0-9]{6}),后跟.HHF.


-o标志强制grep仅打印模式的匹配部分,而不是整行。-P激活 Perl 兼容的正则表达式。

答案2

执行相同操作的 grep 命令的另一个示例:

$ grep -oE '[[:upper:]]{2}[[:digit:]]{8}\.HHF' the_log_file.log > hhf_list.txt

hhf_list.txt:

$ cat hhf_list.txt
MO994001.HHF
MO994002.HHF
TU994001.HHF

怎么运行的

  • -o 仅显示@chaos提到的匹配文本
  • -E 使用扩展正则表达式,因此您可以键入{and }(大括号)而不转义它们,默认 grep 需要 write \{and\}才能达到相同的效果
  • 我更喜欢 POSIX 风格,[[:upper:]] [[:digit:]]这样可以让它更加突出,匹配的内容与计数{2}{6}
  • 扩展名为 .txt 的文件名可选,但可以帮助您记住这是一个文本文件,稍后如果在 Windows 计算机上使用 excel 可能会有所帮助

答案3

如果您想在 sed 中执行类似的正则表达式过程:

sed -n 's/.* \([^\s]\{2,\}\.HHF\)/\1/p' log.txt > files.txt

sed 的默认行为是打印出您提供的文件中的每一行(在本例中为 log.txt)。该-n标志会关闭该行为。该s/REGEXPATTERN/REPLACEMENT/命令将查找具有子字符串匹配的行REGEXPATTERN并将其替换为REPLACEMENT. sed 中用于执行奇特替换的辅助命令的一个示例是命令\#,其中是一个整数,它替换与括号中的第 -th 部分#匹配的行的子字符串,从 1 开始。在这种情况下,它将替换整行仅由该行中至少有两个非空白字符后跟 的部分组成。最后,该命令打印出修改后的行,在本例中仅打印文件名。然后,我们将输出通过管道传输到一个文本文件,该文件将存储所有文件名,每行一个。此 sed 命令假定您的文件在 .HHF 结尾之前至少有两个字符,并且假定文件名前面至少有一个空格。#REGEXPATTERN.HHFp>

相关内容