【问题标题】:Unix Shell Script get only needed lines from a file contentUnix Shell 脚本仅从文件内容中获取所需的行
【发布时间】:2013-09-21 06:49:14
【问题描述】:

编辑

我有一个包含一行字符串的文件

mediafire.com/?a6o37kfc7m68dri

注意:媒体火上的那个文件实际上是“logs.out”,我刚刚将它重命名为 logs.txt,当我上传它时。

示例内容:(logs.out)

BIF in bif_init> login successful
BIF in dbInit> INFO: DB status:20,successful
BIF in dbInit> INFO: get the fileName need be query DB. Size(0) 
BIF in dbInit> INFO: get the fileName need be query DB. Size(30) 
BIF in modInit> INFO: modInit finished
BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/4302253 
BIF in setInputTag> set input tag value, name/value:bill_ref_no/199863752 
BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 
BIF in setInputTag> set input tag value, name/value:DISPUTE_AMOUNT/0 
BIF in setInputTag> set input tag value, name/value:NOD_FLAG/0 
BIF in setInputTag> set input tag value, name/value:OUTSTANDING_BALANCE/12904
BIF in setInputTag> set input tag value, name/value:TOTAL_DUE/12904 
BIF in run> INFO: updateParameterValues finished
BIF in getFile> INFO: Feed file(/arbordata/feedfile/PS-M07-1205-20130807-20130911-201711-1-bif01.DAT) for current invoice
BIF in insertNewFile> m_pcurFileNameAttr->file_seq_no:(1)  
BIF in insertNewFile> INFO:Output fileHeader(000020130911201711
    ) to feedfile,successful 
BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/4302253 
BIF in setInputTag> set input tag value, name/value:bill_ref_no/199863752 
BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 
BIF in setInputTag> set input tag value, name/value:DISPUTE_AMOUNT/0 
BIF in setInputTag> set input tag value, name/value:NOD_FLAG/0 
BIF in setInputTag> set input tag value, name/value:OUTSTANDING_BALANCE/12904
BIF in setInputTag> set input tag value, name/value:TOTAL_DUE/12904 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(BILLZIPCODE) into ACCT map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(BILLEDACCOUNTNUMBER) into ACCT map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(BILLNUMBER) into ACCT map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(BILLNUMBERRESETS) into ACCT map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(OWNINGACCOUNTNUMBER) into SI inherited_map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(SUBSCRBNUMBER) into SI inherited_map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(SUBSCRBNUMBERRESET) into SI inherited_map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(DEFAULTEXTERNALID) into SI inherited_map 
BIF in InvoiceRecord> INFO: Output data to SI map,successful. SI=2813096,0
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(OWNINGACCOUNTNUMBER) into SI inherited_map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(SUBSCRBNUMBER) into SI inherited_map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(SUBSCRBNUMBERRESET) into SI inherited_map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(DEFAULTEXTERNALID) into SI inherited_map 
BIF in InvoiceRecord> INFO: Output data to SI map,successful. SI=13415970,0
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(OWNINGACCOUNTNUMBER) into SI inherited_map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(SUBSCRBNUMBER) into SI inherited_map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(SUBSCRBNUMBERRESET) into SI inherited_map
BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/2726650 
BIF in setInputTag> set input tag value, name/value:bill_ref_no/190155402 
BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 
BIF in setInputTag> set input tag value, name/value:DISPUTE_AMOUNT/0 
BIF in setInputTag> set input tag value, name/value:NOD_FLAG/0 
BIF in setInputTag> set input tag value, name/value:OUTSTANDING_BALANCE/164888
BIF in setInputTag> set input tag value, name/value:TOTAL_DUE/164888 
BIF in run> INFO: updateParameterValues finished
BIF in getFile> INFO: Feed file(/arbordata/feedfile/PS-M02-1204-20130602-20130911-201711-1-bif01.DAT) for current invoice
BIF in insertNewFile> m_pcurFileNameAttr->file_seq_no:(1)  
BIF in insertNewFile> INFO:Output fileHeader(000020130911201711
) to feedfile,successful 
BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/2726650 
BIF in setInputTag> set input tag value, name/value:bill_ref_no/190155402 
BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 
BIF in setInputTag> set input tag value, name/value:DISPUTE_AMOUNT/0 
BIF in setInputTag> set input tag value, name/value:NOD_FLAG/0 
BIF in setInputTag> set input tag value, name/value:OUTSTANDING_BALANCE/164888
BIF in setInputTag> set input tag value, name/value:TOTAL_DUE/164888 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(BILLZIPCODE) into ACCT map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(BILLEDACCOUNTNUMBER) into ACCT map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(BILLNUMBER) into ACCT map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(BILLNUMBERRESETS) into ACCT map 
BIF in addInheritedByField> INFO: Succeed to put the inherited value of field(OWNINGACCOUNTNUMBER) into SI inherited_map 

唯一想要的行:

BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/4302253
BIF in setInputTag> set input tag value, name/value:bill_ref_no/199863752 
BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1

BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/4302253 
BIF in setInputTag> set input tag value, name/value:bill_ref_no/199863752 
BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 

BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/2726650 
BIF in setInputTag> set input tag value, name/value:bill_ref_no/190155402 
BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 

BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/2726650 
BIF in setInputTag> set input tag value, name/value:bill_ref_no/190155402 
BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 

我想将它输出到一个格式如下的文件中:(水平和管道分隔符)

BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/4302253|BIF in setInputTag> set input tag value, name/value:bill_ref_no/199863752|BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 
BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/4302253|BIF in setInputTag> set input tag value, name/value:bill_ref_no/199863752|BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1
BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/2726650|BIF in setInputTag> set input tag value, name/value:bill_ref_no/190155402|BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1
BIF in setInputTag> set input tag value, name/value:ACCOUNT_NO/2726650|BIF in setInputTag> set input tag value, name/value:bill_ref_no/190155402|BIF in setInputTag> set input tag value, name/value:bill_ref_resets/1 

请帮助我:( 我想创建 .sh 文件,它将在 PuTTy 上运行

执行此代码时,它正在工作

sed -n -e '/value:ACCOUNT_NO/{N;N;s/..\n\(.\)/|\1/g;p;}' logs.out> OUPUT_logs.out

但是当

sed -n -e '/value:ACCOUNT_NO/{N;N;s/..\n\(.\)/|\1/g;p;}' logs.out> OUPUT_logs.txt

每条记录之间都有“空白线”。

【问题讨论】:

  • 重新编辑所有行以空格结尾,只需将s/\n/|/g 编辑为s/ \n/|/g(即,在\n 之前添加一个空格)。这应该是所有必要的改变。
  • 非常感谢 .... Chris Jester-Young,Beta,iamauser ....................
  • 但是直到现在我的问题还没有解决............我的输出不是想要的,也许当我将它粘贴到这个论坛时输入文件不一样。 ....因为当我从这里复制 log.txt..@Beta 的代码正在工作...但是当我尝试我的真实输入文件时,结果在管道之前有空格和方形字符..以及打开它时“超编辑”“方形”字符是一个新行....请帮助我找出问题所在.. :(
  • 我不能在这里粘贴真正的输入文件,因为它太长了....但是文件大小只有 220kb

标签: bash shell unix sh


【解决方案1】:

您正在 PuTTY 上运行它。我猜这是您拥有的logs.txt 的Windows 版本。首先在日志文件上运行dos2unix 命令,然后按照我写的那样执行sh 文件:

dos2unix logs.txt

这是a.sha.sh的内容如下:

#!/bin/sh  
awk '/ACCOUNT_NO/,/resets\/1/ {printf $0" "}' logs.txt | awk '{gsub(/resets\/1/,"resets/1\n");print}' | sed -e 's/ BIF/|BIF/g' -e 's/^ |BIF/BIF/g'

在执行前更改文件的权限。

chmod a+x ./a.sh

然后执行文件

./a.sh > new_file.txt

【讨论】:

  • 谢谢,结果更接近了……请帮我修剪第二行开头多余的空间和管道……
  • 最后是什么错误的原因?即使文件已正确创建,但它会引发错误......谢谢@iamauser
  • 我已经编辑了我的答案来解决这个问题。它应该为您提供您在输出中寻找的确切内容...
  • 错误awk: Input line BIF in setInputTag> cannot be longer than 3,000 bytes.
  • mediafire.com/?a6o37kfc7m68dri 请参考此文件...或评论您的电子邮件地址,以便我可以通过电子邮件为您发送 logs.txt 文件。谢谢@iamauser
【解决方案2】:
sed -n -e '/value:ACCOUNT_NO/{N;N;s/\n/|/g;p;}' logs.txt > outfile.txt

编辑:

我已经修改了上面的命令以将输出重定向到一个文件,但更重要的是我们更正了输出。我已经使用您提供的示例logs.txt 测试了该命令;我对您的系统了解得不够多,无法说明为什么它在那里不起作用,所以让我们进行实验。试试这个:

sed -n -e '/value:ACCOUNT_NO/p' logs.txt

输出是什么?

编辑:

到目前为止,一切都很好。现在试试这个:

sed -n -e '/value:ACCOUNT_NO/{p;}' logs.txt

同样的输出?

编辑:

好!现在:

sed -n -e '/value:ACCOUNT_NO/{N;N;p;}' logs.txt

输出是什么?

编辑:

最后一步,我们重定向到outputfile.txt 并删除换行符。正如@ChrisJester-Young 所说,我们可以在同一步骤中删除尾随空格:

sed -n -e '/value:ACCOUNT_NO/{N;N;s/ \n/|/;p;}' logs.txt > outputfile.txt

编辑

试试这个,我们称之为code 6

sed -n -e '/value:ACCOUNT_NO/{N;N;s/..\n/|/g;p;}' logs.txt > outputfile.txt

编辑:

问题是你的logs.txt 有DOS 风格的行尾。我认为 Code 6 将它们更改为 UNIX 样式,并且 ultra edit 警告您它们很奇怪。试试这个(代码 7):

sed -n -e '/value:ACCOUNT_NO/{N;N;s/..\n\(.\)/|\1/g;p;}'

【讨论】:

  • 谢谢,但您的代码的输出只是屏幕,结果只有:|setInputTag 中的 BIF> 设置输入标签值,名称/值:bill_ref_resets/1 752 |setInputTag 中的BIF> 设置输入标签值,名称/值:bill_ref_resets/1 752 |BIF in setInputTag> 设置输入标签值,名称/值:bill_ref_resets/1 402 |BIF in setInputTag> 设置输入标签值,名称/值:bill_ref_resets/1 402 |BIF in setInputTag> 设置输入标签值,名称/值:bill_ref_resets/1 664 |BIF in setInputTag> 设置输入标签值,名称/值:bill_ref_resets/1 664 |BIF in setInputTag> 设置输入标签值,名称/值:bill_
  • where is BIF in setInputTag> 设置输入标签值,name/value:ACCOUNT_NO/ and BIF in setInputTag> 设置输入标签值,name/value:bill_ref_no/ ?
  • BIF in setInputTag> 设置输入标签值,name/value:ACCOUNT_NO/4603164 BIF in setInputTag> 设置输入标签值,name/value:ACCOUNT_NO/7455269 BIF in setInputTag> 设置输入标签值,名称/value:ACCOUNT_NO/7455269
  • @user2775189 请将输出放入您的问题中(您可以在未经批准的情况下进行编辑)
  • @Beta 下一步该做什么?
【解决方案3】:

制作一个名为 summarise_accounts.sh 的 shell 脚本:

#!/bin/bash
exec paste -d'|' <(grep value:ACCOUNT_NO "$1") <(grep value:bill_ref_no "$1") <(grep value:bill_ref_resets "$1")

使其可执行 (chmod +x summarise_accounts.sh),然后像这样运行它:

./summarise_accounts.sh logs.txt >account_summary.txt

当然,您可以在命令行上更改文件名。

【讨论】:

  • 对不起,我的无知,但是我如何把它放到 .sh 文件中?
  • #! /bin/bash 粘贴 -d'|'
  • 是的,只需在顶部添加一个#!/bin/bash 行。
  • 这段代码的输出是什么文件名?它是与代码相关的“粘贴”关键字吗?谢谢你,克里斯
  • 请帮助...错误的原因是什么? Syntax error at line 2 : '(' is not expected.
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多