我有一个日志文件,如下所示:
########### 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
.HHF
p
>