shell脚本将选定文本写入单行

shell脚本将选定文本写入单行,shell,awk,Shell,Awk,您好,我有一个日志文件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:

您好,我有一个日志文件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::
我想grep并将getConnection请求的时间戳和getConnection DONE(针对特定ID)的时间戳打印到一个文件中

我已经编写了一个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
输出如下所示

   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
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
我怎么能做到?请帮忙

我需要如下所示的输出

   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
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

管道连接到
tr
以删除换行符,如下所示:

grep ID=$i: trace.log | grep getConnection | cut -d'[' -s -f1 | tr -d '\n'

使用
awk
可以通过更改以下命令来保存某些命令:

grep ID=$i: trace.log | grep getConnection | cut -d'[' -s -f1
致:


为什么不让
awk
doall(使用您的数据):


一些更改了版本并添加了
sort

awk -F" \\\[|=" '{split($3,i,":")} g {/DONE/?d[i[1]]=$1:r[i[1]]=$1} END {for (j in r) print "ID="j,g,r[j]","d[j]}' g="getConnection" file | sort -k1
ID=1298 getConnection 2014-01-23 15:50:41,727,2014-01-23 15:50:41,733
ID=1304 getConnection 2014-01-23 15:50:41,725,
ID=1307 getConnection 2014-01-23 15:50:41,727,
ID=1308 getConnection 2014-01-23 15:50:41,724,2014-01-23 15:50:41,733
ID=1309 getConnection 2014-01-23 15:50:41,738,
ID=1310 getConnection 2014-01-23 15:50:41,737,
ID=1311 getConnection 2014-01-23 15:50:41,738,2014-01-23 15:50:41,744
ID=1313 getConnection 2014-01-23 15:50:41,734,2014-01-23 15:50:41,734
ID=1315 getConnection 2014-01-23 15:50:41,743,
ID=1318 getConnection 2014-01-23 15:50:41,747,

另一个需要修改的是说
echo-n“ID=$i,getConnection”>>time.log
。如何在两个字段之间引入空格,2014-01-23 15:50:16和2014-01-23 15:50:16706您应该已经获得了一个空格,因为
[
。不需要通过循环所有数字来测试它是否存在。您可以将所有数字存储在数组中并从中排序。