1

这应该是不费脑子的,但显然我今天没有脑子。

我有 50 个 20-gig 日志,其中包含来自多个应用程序的条目,其中一个在其日志行中添加了一个事务 ID。我需要查看 42 个事务 ID,我想将相应的行解析为单独的文件。

要做一个文件,命令很简单,

grep CDBBDEADBEEF2020X02393 server.log* > CDBBDEADBEEF2020X02393.log

从所有 50 个 server.log 中创建一个与该事务隔离的日志。

现在,我有一个包含 42 个 txnID 的文件(这里缩短为 4 个):

CDBBDEADBEEF2020X02393 
CDBBDEADBEEF6548X02302 
CDBBDE15644F2020X02354 
ABBDEADBEEF21014777811 

我写道:

#/bin/sh
grep $1 server.\* > $1.log

但这行不通。将 shebang 更改为 #/bin/bash -xv,给了我这个奇怪的输出(显然我在玩正确的逃生魔法必须是什么):

$ ./xtrakt.sh B7F6E465E006B1F1A
#!/bin/bash -xv
grep - ./server\.\*
' grep - './server.*
: No such file or directory

我也试过命令行

grep - server.* < txids.txt > $1

但显然 $1 毫无意义,我不知道如何使用命令的输入重定向形式获取每个 txid 命名的文件。

提前感谢您的任何想法。我没有走在 shell 脚本中执行 foreach 的路线,因为我希望 grep 将原始文件名放在输出行中,以便稍后在需要时检查上下文。

另外 - 最好让 server.* 文件按数字顺序排列(server.log.1、server.log.2 NOT server.log.1、server.log.10...)

4

1 回答 1

2

尝试这个:

while read -r txid
do
    grep "$txid" server.* > "$txid.log"
done < txids.txt

对于文件排序 - 用一位数重命名文件到两位数,前导零,例如mv server.log.1 server.log.01.

于 2013-05-17T19:44:27.473 回答