2

我有一个日志文件.log:

toto string1 tata string2 tito string3
tata tati string3
titi string1 tato string2 tati toto
.....
tutu string1 tita string2 tita string3

我需要从文件的每一行中提取 string1、string2 和 string3。这些行可以包含一个或两个或三个字符串。

我第一次尝试使用 while read LINE do grep:

while read line; do 
z_string1=`echo $line | egrep 'string1' | cut -f2 xxx | cut -f1 xxxx`
z_string2=`echo $line | egrep 'string2' | cut -f2 xxx | cut -f1 xxxx`
z_string3=`echo $line | egrep 'string3' | cut -f2 xxx | cut -f1 xxxx`
echo "$z_string1,$z_string2,$z_string3" >> results.csv
done < file.log

这可以按预期工作,但根本没有优化,而且速度很慢。

谢谢您的帮助!

4

4 回答 4

1

有很多方法可以实现这一目标。由于您似乎更喜欢 shell,因此您应该看一下awk,它基本上就是为此而设计的。

Perl 也正是为这类任务而设计的。一个简单的脚本,其中包含一些正则表达式来匹配您的搜索词,然后是打印。

于 2013-04-26T04:13:31.850 回答
1

trygrep -oE "string[0-9]" file.log >> results.csv -o标志只给出匹配的部分作为输出

于 2013-04-26T07:06:24.840 回答
0

使用bash正则表达式匹配来捕获字符串(如果存在),然后打印它们。我从您的示例中假设,如果找不到匹配项,您只想打印一个空字符串,因此我保留该行为。

while read line; do
    [[ $line =~ (string1) ]]; printf "%s," "$BASH_REMATCH"
    [[ $line =~ (string2) ]]; printf "%s," "$BASH_REMATCH"
    [[ $line =~ (string3) ]]; printf "%s\n" "$BASH_REMATCH"
done

这可能没有perlawk解决方案那么快,但应该是对您原来的改进,因为不需要创建额外的流程;一切都在bash.

于 2013-04-26T14:51:00.203 回答
0

从我可以看到你的字符串模式正在改变列:

toto string1 tata string2 tito **string3**
tata tati string3
titi string1 tato string2 tati toto
.....
tutu string1 tita string2 tita string3

第 2 行是第 3 列,其余的是 column2,因此没有必要依赖列号进行输出,如下所示:

awk -v pattern="string" '{cols=NF; if ( (cols == 6 ) && ($2 ~ pattern))   { print $2 " " $4 " " $6 } }' test.txt 
string1 string2 string3
string1 string2 toto
string1 string2 string3

所以..

您可以将其或其中的一部分用于您的解决方案

    awk -v p1="string1" -v p2="string2" -v p3="string3" 'BEGIN { c1=0; c2=0; c3=0; }
 {if (( $0 ~ p1) || ( $0 ~ p2) || ($0 ~ p3 ))  { 
    for (i=1;i<=NF;i++) {
        if ( $i ~ p1)   { print $i; c1++; 
        } else if  ( $i ~ p2)   { print $i; c2++; 
        } else if ( $i ~ p3)   { print $i; c3++; }
   }  } 
   } END{ print p1"_count:" c1 " "p2"_count:" c2"  "p3"_count:"c3}  ' test.txt

这会产生:

string1
string2
string3
string3
string1
string2
string1
string2
string3
string1_count:3 string2_count:3  string3_count:3
于 2013-04-26T09:28:43.563 回答