将选定字段写入一行的 shell 脚本

hs.*_*dra 5 grep bash shell-script cut bash-script

我有一个日志文件trace.log,它打印时间戳、线程名称和事务方法以及事务 ID,如下所示。

2014-01-23 15:50:41,724 [catalina-exec-35] INFO  TRANSACTION getConnection REQUEST, ID=1308::
2014-01-23 15:50:41,725 [catalina-exec-33] INFO  TRANSACTION getConnection REQUEST, ID=1304::
2014-01-23 15:50:41,727 [catalina-exec-10] INFO  TRANSACTION getConnection REQUEST, ID=1298::
2014-01-23 15:50:41,727 [catalina-exec-24] INFO  TRANSACTION getConnection REQUEST, ID=1307::
2014-01-23 15:50:41,727 [catalina-exec-12] INFO  TRANSACTION getConnection DONE, ID=1305::
2014-01-23 15:50:41,733 [catalina-exec-10] INFO  TRANSACTION getConnection DONE, ID=1298::
2014-01-23 15:50:41,734 [catalina-exec-26] INFO  TRANSACTION getConnection REQUEST, ID=1313::
2014-01-23 15:50:41,734 [catalina-exec-26] INFO  TRANSACTION getConnection DONE, ID=1313::
2014-01-23 15:50:41,738 [catalina-exec-39] INFO  TRANSACTION getConnection REQUEST, ID=1311::
2014-01-23 15:50:41,733 [catalina-exec-35] INFO  TRANSACTION getConnection DONE, ID=1308::
2014-01-23 15:50:41,738 [catalina-exec-27] INFO  TRANSACTION getConnection REQUEST, ID=1309::
2014-01-23 15:50:41,737 [catalina-exec-22] INFO  TRANSACTION getConnection REQUEST, ID=1310::
2014-01-23 15:50:41,743 [catalina-exec-30] INFO  TRANSACTION getConnection REQUEST, ID=1315::
2014-01-23 15:50:41,744 [catalina-exec-39] INFO  TRANSACTION getConnection DONE, ID=1311::
2014-01-23 15:50:41,747 [catalina-exec-2] INFO  TRANSACTION getConnection REQUEST, ID=1318::
Run Code Online (Sandbox Code Playgroud)

我想将单行中特定 IDgrepgetConnection REQUEST和 的 时间戳打印 getConnection DONE到文件中。

我写了一个 shell 脚本,它在多行中打印时间戳,如下所示。这是我的 shell 脚本

for i in {1..800}
do
     echo "Welcome $i times"
     echo "ID=$i, getConnection " >> time.log
     grep ID=$i: trace.log | grep getConnection | cut -d'[' -s -f1 >> time.log
echo "      " >> time.log
done
Run Code Online (Sandbox Code Playgroud)

输出如下图

ID=791, getConnection
2014-01-23 15:50:16,703
2014-01-23 15:50:16,706

ID=792, getConnection
2014-01-23 15:50:16,704
2014-01-23 15:50:16,704

ID=793, getConnection
2014-01-23 15:50:16,704
2014-01-23 15:50:16,709

ID=794, getConnection
2014-01-23 15:50:16,708
2014-01-23 15:50:16,712
Run Code Online (Sandbox Code Playgroud)

我怎么能改变呢?我需要如下所示的输出:

ID=792, getConnection 2014-01-23 15:50:16,703 2014-01-23 15:50:16,706

ID=792, getConnection 2014-01-23 15:50:16,704 2014-01-23 15:50:16,704

ID=793, getConnection 2014-01-23 15:50:16,704 2014-01-23 15:50:16,709

ID=794, getConnection 2014-01-23 15:50:16,708 2014-01-23 15:50:16,712
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 6

不要使用 shell 循环来处理文本,这是不好的做法。

shell 的工作是运行命令(正确的命令)并使它们协作完成任务。

在这里,正确的命令是调用一次的实际提取和报告语言解释器,而不是为文件的每一行运行(按顺序!)几个命令。

perl -lne '
  if (/(.*?) \[.*getConnection (.*?), (ID=\d+)/) {
    if ($2 eq "REQUEST") {$r{$3}=$1}
    elsif ($2 eq "DONE") {print "$3, getConnection $r{$3} $1" if $r{$3}}
  }' < your-file
Run Code Online (Sandbox Code Playgroud)