如何在bash中从特定应用程序数据库文件创建日志文件?

4

我有一个特定的应用程序数据库文件,类似于这样:

•r vbc.vvc lin K$³ñ123456 Œ Œ P
P P ;šÉÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ Œ ÿÿÿÿ Œ P T X Œ P 999999999 ëu q0 …ª¤ ;šÉÿOverLimitLog ÿÿ 06/27/2013 00:05:55 RS_A1_6 hijitso 183.49 OverLow ÿÿ 06/27/2013 00:16:30 qaser hijitso 993.08 hffvcgcf ÿÿ 06/27/2013 00:18:46 yuikl hijitso 993.08 hffvcgcf ÿÿ 06/27/2013 00:25:01 gcxsd hijitso 999.18 hffvcgcf ÿÿ 06/27/2013 00:40:45 hgdrt sdfcdsfb 0.00 Normal ÿÿ 06/27/2013 06:25:55 khuhukjmnj,l sdfcdsfa 13.13 hasfldkdgh ÿÿ 06/27/2013 06:25:55 khuhukjmnj,l sdfcdsfc 13.13 hasfldkdgh ÿÿ 06/27/2013 06:25:55 khuhukjmnj,l sdfcdsfb 13.13 hasfldkdgh ÿÿ 06/27/2013 06:27:16 khuhukjmnj,l sdfcdsfa 0.00 Normal ÿÿ 06/27/2013 06:27:16 khuhukjmnj,l sdfcdsfc 0.00 Normal fhfx 06/27/2013 06:27:16 khuhukjmnj,l sdfcdsfb 0.00 Normal ÿÿ 06/27/2013 06:28:05 khuhukjmnj,l sdfcdsfa 10.79 hasfldkdgh ÿÿ 06/27/2013 06:28:05 khuhukjmnj,l sdfcdsfc 10.79 hasfldkdgh ÿÿ 06/27/2013 06:30:05 khuhukjmnj,l sdfcdsfc 9.38 hasfldkdgh ÿÿ 06/27/2013 06:30:05 khuhukjmnj,l sdfcdsfb 9.38 hasfldkdgh ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ
我希望将其转换为这种格式:
06/27/2013  06:27:16 khuhukjmnj,l      sdfcdsfc              0.00 Normal

我必须说,我的文件不是普通的文本格式,在gedit中打开会有一些无法读取的字符,但是emacs23可以打开这些文件。


1
最好检查一下这个文件是如何生成的。 - fedorqui
我不知道为什么日志文件会出现在6行。 - Avinash Raj
这是一个应用程序数据库。该软件可以读取并在其内部显示。 - user3121138
2个回答

4
使用GNU awk,您可以像这样做:
$ awk 'NR>1{print RS, $1, $2, $3, $4, $5, $6}' RS='fhfx' OFS='\t' file
fhfx    06/27/2013  00:05:55    RS_A1_6 hijitso 183.49  OverLow
fhfx    06/27/2013  00:16:30    qaser   hijitso 993.08  hffvcgcf
fhfx    06/27/2013  00:18:46    yuikl   hijitso 993.08  hffvcgcf
fhfx    06/27/2013  00:25:01    gcxsd   hijitso 999.18  hffvcgcf
fhfx    06/27/2013  00:40:45    hgdrt   sdfcdsfb    0.00    Normal
fhfx    06/27/2013  06:25:55    khuhukjmnj,l    sdfcdsfa    13.13   hasfldkdgh
fhfx    06/27/2013  06:25:55    khuhukjmnj,l    sdfcdsfc    13.13   hasfldkdgh
fhfx    06/27/2013  06:25:55    khuhukjmnj,l    sdfcdsfb    13.13   hasfldkdgh
fhfx    06/27/2013  06:27:16    khuhukjmnj,l    sdfcdsfa    0.00    Normal
fhfx    06/27/2013  06:27:16    khuhukjmnj,l    sdfcdsfc    0.00    Normal
fhfx    06/27/2013  06:27:16    khuhukjmnj,l    sdfcdsfb    0.00    Normal
fhfx    06/27/2013  06:28:05    khuhukjmnj,l    sdfcdsfa    10.79   hasfldkdgh
fhfx    06/27/2013  06:28:05    khuhukjmnj,l    sdfcdsfc    10.79   hasfldkdgh
fhfx    06/27/2013  06:30:05    khuhukjmnj,l    sdfcdsfc    9.38    hasfldkdgh
fhfx    06/27/2013  06:30:05    khuhukjmnj,l    sdfcdsfb    9.38    hasfldkdgh

或者如果你想让它更漂亮,可以使用
$ awk 'NR>1{print RS, $1, $2, $3, $4, $5, $6}' RS='fhfx' file | column -t 
fhfx  06/27/2013  00:05:55  RS_A1_6       hijitso   183.49  OverLow
fhfx  06/27/2013  00:16:30  qaser         hijitso   993.08  hffvcgcf
fhfx  06/27/2013  00:18:46  yuikl         hijitso   993.08  hffvcgcf
fhfx  06/27/2013  00:25:01  gcxsd         hijitso   999.18  hffvcgcf
fhfx  06/27/2013  00:40:45  hgdrt         sdfcdsfb  0.00    Normal
fhfx  06/27/2013  06:25:55  khuhukjmnj,l  sdfcdsfa  13.13   hasfldkdgh
fhfx  06/27/2013  06:25:55  khuhukjmnj,l  sdfcdsfc  13.13   hasfldkdgh
fhfx  06/27/2013  06:25:55  khuhukjmnj,l  sdfcdsfb  13.13   hasfldkdgh
fhfx  06/27/2013  06:27:16  khuhukjmnj,l  sdfcdsfa  0.00    Normal
fhfx  06/27/2013  06:27:16  khuhukjmnj,l  sdfcdsfc  0.00    Normal
fhfx  06/27/2013  06:27:16  khuhukjmnj,l  sdfcdsfb  0.00    Normal
fhfx  06/27/2013  06:28:05  khuhukjmnj,l  sdfcdsfa  10.79   hasfldkdgh
fhfx  06/27/2013  06:28:05  khuhukjmnj,l  sdfcdsfc  10.79   hasfldkdgh
fhfx  06/27/2013  06:30:05  khuhukjmnj,l  sdfcdsfc  9.38    hasfldkdgh
fhfx  06/27/2013  06:30:05  khuhukjmnj,l  sdfcdsfb  9.38    hasfldkdgh

非常好的回答!我喜欢Bash。 - Thibault
现在我该如何开始使用数据行? - user3121138
我的真实文件包含“ÿÿ”字符。在“ÿÿ”之前,我有一根管道符号,但这里没有显示。次要问题:我该如何从文件中删除它? - user3121138
@user3121138 我不确定我理解你的意思。也许您应该编辑您的问题,包括更多现实的输入和输出示例。 - user000001
@user3121138 请尝试将 print RS, $1, ... 更改为 print RT, $1, ...RT 变量保存了由 RS 变量匹配的分隔符 - 即当前记录之后的分隔符。您还可以使用一个保持变量来保存上一条记录的 RT 值。 - user000001
显示剩余2条评论

3
你可以尝试这个方法:
cat output.txt | sed 's/fhfx/\n&/g' | sed 's/ÿÿ *//g' | sed  '/fhfx/!d'

结果是:
fhfx  06/27/2013  00:05:55 RS_A1_6         hijitso            183.49 OverLow        
fhfx  06/27/2013  00:16:30 qaser           hijitso            993.08 hffvcgcf         
fhfx  06/27/2013  00:18:46 yuikl           hijitso            993.08 hffvcgcf         
fhfx  06/27/2013  00:25:01 gcxsd           hijitso            999.18 hffvcgcf         
fhfx  06/27/2013  00:40:45 hgdrt           sdfcdsfb              0.00 Normal         
fhfx  06/27/2013  06:25:55 khuhukjmnj,l    sdfcdsfa             13.13 hasfldkdgh      
fhfx  06/27/2013  06:25:55 khuhukjmnj,l    sdfcdsfc             13.13 hasfldkdgh      
fhfx  06/27/2013  06:25:55 khuhukjmnj,l    sdfcdsfb             13.13 hasfldkdgh      
fhfx  06/27/2013  06:27:16 khuhukjmnj,l    sdfcdsfa              0.00 Normal         
fhfx  06/27/2013  06:27:16 khuhukjmnj,l    sdfcdsfc              0.00 Normal         
fhfx  06/27/2013  06:27:16 khuhukjmnj,l    sdfcdsfb              0.00 Normal         
fhfx  06/27/2013  06:28:05 khuhukjmnj,l    sdfcdsfa             10.79 hasfldkdgh      
fhfx  06/27/2013  06:28:05 khuhukjmnj,l    sdfcdsfc             10.79 hasfldkdgh      
fhfx  06/27/2013  06:30:05 khuhukjmnj,l    sdfcdsfc              9.38 hasfldkdgh      
fhfx  06/27/2013  06:30:05 khuhukjmnj,l    sdfcdsfb              9.38 hasfldkdgh  

你在倒数第二行有一个问题,但我不知道是否可以。我不知道你是否想要对齐你的列等等。


你不需要使用cat命令,因为sed可以在命令行上接受文件名 - 参见UUOC。 - user353608
@Iain 是的,但那只是一个例子,因为我不知道日志文件的来源。也许他想要 tail 它,或者它是某个其他命令的结果。 - Thibault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接