Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UNIX shell脚本只需要从具有下一行的某些标准的文件内容需要行来考虑_Unix_Sed_Awk_Grep_Sh - Fatal编程技术网

UNIX shell脚本只需要从具有下一行的某些标准的文件内容需要行来考虑

UNIX shell脚本只需要从具有下一行的某些标准的文件内容需要行来考虑,unix,sed,awk,grep,sh,Unix,Sed,Awk,Grep,Sh,帮助。。。。。。。仍然不起作用 我有一个包含字符串的文件: http://mediafire.com/?a6o37kfc7m68dri 部分内容: 我的方案是,我想创建一个.sh脚本,该脚本将从文件中获取所需的所有字符串,并将其格式化如下,最后将其输出到一个新文件: 编辑 其中: 第1列:BIF在setInputTag>设置输入标记值,名称/值:科目号/1729030 第2列:BIF在setInputTag>设置输入标签值,名称/值:票据参考号/192840714 第3列:BIF在setI

帮助。。。。。。。仍然不起作用

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

http://mediafire.com/?a6o37kfc7m68dri

部分内容:

我的方案是,我想创建一个.sh脚本,该脚本将从文件中获取所需的所有字符串,并将其格式化如下,最后将其输出到一个新文件:

编辑

其中:

  • 第1列:
    BIF在setInputTag>设置输入标记值,名称/值:科目号/
    1729030
  • 第2列:
    BIF在setInputTag>设置输入标签值,名称/值:票据参考号/
    192840714
  • 第3列:
    BIF在setInputTag>设置输入标签值时,名称/值:bill\u ref\u resets/
    1
  • 第4列:
    errcode=
    1422
  • 第5列:
    errtext=
    执行OCI函数时出错未使用:
编辑

最后我觉得离我的目标更近了

执行此代码后:

egrep -e 'ACCOUNT_NO|bill_ref_no|bill_ref_resets|errcode|errtext' logs.txt | awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=4 a=0 s='errtext'
(同上:分成一条线)-运行时,将其放入一条线:

egrep -e 'ACCOUNT_NO|bill_ref_no|bill_ref_resets|errcode|errtext' logs.txt
|awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}'
b=4 a=0 s='errtext'
编辑

将这行代码添加到以前的代码后:

| sed -e 's/=/:/' -e 's/^BIF.*://' -e 's=/=:=' -e 's/^ *//' -e 's/ *: /:/' | sed -e 's/ACCOUNT_NO://g' -e 's/bill_ref_no:/|/g' -e 's/bill_ref_resets:/|/g' -e 's/errcode:/|/g' -e 's/errtext:/|/g'
这是我现在的输出:

现在的最后一个问题是如何修剪换行符以获得下面的输出

它尝试添加此代码,但不起作用:

| sed -e 's/\n//g;'
如何修剪那些新线条

所需输出为:

我的全部代码现在:

请试试这个

egrep -e 'ACCOUNT_NO|bill_ref_no|bill_ref_resets|errcode|(Error in execution)'
logs.txt       
| 
grep -B4 'Error in execution' 
|
sed -e 's/ACCOUNT_NO\/\(.*\)/\1|/' -e 's/.*bill_ref_no\/\(.*\)/\1|/' -e 's/.*bill_ref_resets\/\(.*\)/\1|/' -e 's/.*errcode.*= \(.*\)/\1|/' 
-e 's/.*errtext.*= \(.*\)/\1/' -e '/--/d' 
| tr -d '\n' | sed  -e 's/:/:\n/g' -e 's/ |/|/g'
> out_put_file.txt
我用bash开发了Ubuntu 12.10。这太长了,所以我把它分成几行,当你运行它的时候,你需要把它们放在一行。StackOverflow还存在一些格式问题。我需要编辑它以显示完整的命令行

这是我的输出

1729030|192840714|1|1422|Error in execution of OCI function unused:
1746056|202085235|1|1422|Error in execution of OCI function unused:
809434|201632617|1|1422|Error in execution of OCI function unused:
6993375|202888775|1|1422|Error in execution of OCI function unused:
7453294|199851665|1|1422|Error in execution of OCI function unused:

根据给定的logs.txt,原始输出的第二行似乎是错误的。

仅一个awk命令即可:

#!/usr/bin/awk -f

{
    if (/ACCOUNT_NO/) {
        sub(/.*\//, "")
        account_no = $NF
        step = 2
    } else if (/bill_ref_no/) {
        if (step++ == 2) {
            sub(/.*\//, "")
            bill_ref_no = $NF
        } else {
            step = 1
        }
    } else if (/bill_ref_resets/) {
        if (step++ == 3) {
            sub(/.*\//, "")
            bill_ref_resets = $NF
        } else {
            step = 1
        }
    } else if (/errcode/) {
        if (step++ == 4) {
            sub(/.* = /, "")
            errcode = $0
        } else {
            step = 1
        }
    } else if (/errtext/) {
        if (step == 5) {
            sub(/.* = /, "")
            print account_no "|" bill_ref_no "|" bill_ref_resets "|" errcode "|" $0
        }
        step = 1
    }
}
运行方式:

awk -f script.awk log.txt
基于上述输入的输出:

1746056|202085235|1|1422|Error in execution of OCI function unused:

sed-n-e'/value:ACCOUNT\u NO/{n;n;s/.\n\(.\)/\1/g;p;}'logs.txt>output\u logs.out
这是我们迄今为止尝试的。。。但这并不是新的情况。我是一个全新的shell脚本编写者。。。请给我一些帮助。@user2775189这些值是否仅显示在一行中?我的意思是如果所有这些值都可以在源文件的一行中找到。能否显示源文件中包含完整数据集的部分?部分内容请参考编辑后的问题thanksHi@konsolebox请参考编辑后的帖子。。。感谢运行
uname-a
或运行
echo$HOSTNAME
egrep:cannotopenlogs.txt
grep:inally option--B
grep:inally option--4
用法:grep[-E |-F][-c |-l |-q][-bhinsvwx]-E模式列表。。。[-f pattern|u file…][file…]
用法:grep[-E|-f][-c|-l|-q][-bhinsvwx][E pattern_list…]-f pattern|u file。。。[文件…][/code>
用法:grep[-E |-F][-c |-l |-q][-bhinsvwx]模式[文件…][/code>
uname-a
B.11.23 U ia64 1103159669无限制用户许可第一个错误表示您的
logs.txt
不在当前文件夹中。对于第二个错误,只需将
grep
替换为
egrep
egrep:inally选项--B
用法:egrep[-c |-l |-q][bhinsvwx]-e模式列表[-f pattern_file…][file…]`
用法:egrep[-c |-l |-q][-bhinsvwx][-e pattern_list…]-f pattern_file。。。[file…]
用法:egrep[-c |-l |-q][-bhinsvwx]模式[file…]
语法错误源代码行是3。
错误上下文是
awk:Quitting
源代码行是3。
@user2775189我再次测试了脚本,它运行良好。也许这取决于你的awk?你确定你复制的很好吗?@konslebox关于awk有兼容性问题吗?因为我又试了一次,结果又犯了一个错误,和我之前的评论一样。。。。怎么了?HP-UX是server@user2775189我也用其他awk变体测试了它,它对我来说效果很好。
egrep -e 'ACCOUNT_NO|bill_ref_no|bill_ref_resets|errcode|(Error in execution)'
logs.txt       
| 
grep -B4 'Error in execution' 
|
sed -e 's/ACCOUNT_NO\/\(.*\)/\1|/' -e 's/.*bill_ref_no\/\(.*\)/\1|/' -e 's/.*bill_ref_resets\/\(.*\)/\1|/' -e 's/.*errcode.*= \(.*\)/\1|/' 
-e 's/.*errtext.*= \(.*\)/\1/' -e '/--/d' 
| tr -d '\n' | sed  -e 's/:/:\n/g' -e 's/ |/|/g'
> out_put_file.txt
1729030|192840714|1|1422|Error in execution of OCI function unused:
1746056|202085235|1|1422|Error in execution of OCI function unused:
809434|201632617|1|1422|Error in execution of OCI function unused:
6993375|202888775|1|1422|Error in execution of OCI function unused:
7453294|199851665|1|1422|Error in execution of OCI function unused:
#!/usr/bin/awk -f

{
    if (/ACCOUNT_NO/) {
        sub(/.*\//, "")
        account_no = $NF
        step = 2
    } else if (/bill_ref_no/) {
        if (step++ == 2) {
            sub(/.*\//, "")
            bill_ref_no = $NF
        } else {
            step = 1
        }
    } else if (/bill_ref_resets/) {
        if (step++ == 3) {
            sub(/.*\//, "")
            bill_ref_resets = $NF
        } else {
            step = 1
        }
    } else if (/errcode/) {
        if (step++ == 4) {
            sub(/.* = /, "")
            errcode = $0
        } else {
            step = 1
        }
    } else if (/errtext/) {
        if (step == 5) {
            sub(/.* = /, "")
            print account_no "|" bill_ref_no "|" bill_ref_resets "|" errcode "|" $0
        }
        step = 1
    }
}
awk -f script.awk log.txt
1746056|202085235|1|1422|Error in execution of OCI function unused: