我有许多包含目标行的日志文件,我希望'grep',例如:
EGPA019_90pc.recode.2.log:Cross-Entropy (masked data): 0.556984我希望将间隔为制表符的"2“和"0.556984”切成一个文件
所以,如果我输入:
grep "Cross-Entropy (masked data):" *.log | cut -d '.' -f 3 >> targetFile.txt我得到了"2",然后:
grep "Cross-Entropy (masked data):" *.log | cut -d ' ' -f 4 >> targetFile.txt我得到了"0.556984“。但是,我如何在一行代码中获得目标文件中同一行上的"2“,然后是制表符,然后是"0.556984”?
非常感谢
克莱夫
发布于 2016-11-28 14:15:03
你可以使用grep和一些bash内置的regEx特性。
grep -h "Cross-Entropy (masked data):" *.log | while IFS= read -r string; do
[[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]]
printf "%s\t%s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]//[[:blank:]]}";
done我的输入文件
$ cat *.log
EGPA019_90pc.recode.2.log:Cross-Entropy (masked data): 0.556984
EGPA019_90pc.recode.9.log:Cross-Entropy (masked data): 0.996984
EGPA019_90pc.recode.7.log:Cross-Entropy (masked data): 0.756984
$ grep -h "Cross-Entropy (masked data):" *.log | while IFS= read -r string; do
[[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]]
printf "%s\t%s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]//[[:blank:]]}"; done
2 0.556984
9 0.996984
7 0.756984解释:-
bash regEx功能来捕获所需的字符串,而不是使用其他本机工具。grep的输出通过管道来应用regEx [ "$string" =~ recode.([[:digit:]]+).*:\ (.*)$ ]],它捕获您所需的条目、数字和小数number.printf以打印这些变量。第二个捕获,即十进制数字的开头有空格字符,通过"${BASH_REMATCH[2]//[[:blank:]]}"将其删除
您还可以将其封装在shell脚本中,如下所示:
#!/bin/bash
while IFS= read -r string; do
[[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]]
printf "%s\t%s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]//[[:blank:]]}"
done < <(grep -h "Cross-Entropy (masked data):" *.log)或者)使用带有PCRE标志-P选项的grep和xargs来过滤输出。
grep -Pho '\.recode\.\K\d+|: \K.*' *.log | xargs -n2 -d'\n'
2 0.556984
9 0.996984
7 0.756984(或者)使用简单得多的perl regEx语法。
perl -lne 'print "$1 $2" if /\.recode\.(\d+).*:\s+(.*)/' *.log
2 0.556984
9 0.996984
7 0.756984发布于 2016-11-28 16:54:21
我想我应该使用awk而不是解析grep的输出。
我没有您的数据集来测试它,但在我看来,以下方法应该可以工作。
awk '/^Cross-Entropy \(masked data\):/ {split(FILENAME,a,".");printf("%s\t%s\n", a[3], $NF}' *.log作为一行代码,它有点长。作为独立脚本,它可能如下所示:
#!/usr/bin/awk -f
/^Cross-Entropy \(masked data\):/ {
split(FILENAME,a,".")
printf("%s\t%s\n", a[3], $NF
}将其保存在一个文件中,使其成为可执行文件,您就拥有了一个全新的shell命令。
请注意,这是通过使用字段拆分来实现的,而不是使用正则表达式。
发布于 2016-11-29 06:01:50
您可以使用sed删除不需要的内容
grep "Cross-Entropy (masked data):" *.log | sed 's/.*recode.//;s/\..*: //' grep和sed可以组合使用:
sed -n '/Cross-Entropy (masked data):/ {s/.*recode.//;s/\..*: //;p}' *.loghttps://stackoverflow.com/questions/40837885
复制相似问题