使用

时间:2018-01-16 06:16:00

标签: awk

我的文本文件bnglr.txt有以下txt,我想根据我的要求删除某些字符串,实际上我需要删除| SUCCESS | rc=0 | (stdout) #< - 每行的部分

# cat bnglr.txt
rraka-ged.rraka.com | SUCCESS | rc=0 | (stdout) # Profile host: trdls.rraka.com
rraka-avinashj.rraka.com | SUCCESS | rc=0 | (stdout) # Profile host: trdls.rraka.com  
  

我已通过awktr获得此功能,并返回所需内容,   虽然我在寻找是否可以用awk本身完成   没有tr ..以下是我收到的结果输出&期望的

# awk '{gsub( /SUCCESS|rc=0|stdout/, "") ;a=$1;gsub($1 , "");print a,$0 }' bnglr.txt | tr -d "()|" | column -t 
rraka-ged.rraka.com          #  Profile  host:  trdls.rraka.com
rraka-avinashj.rraka.com     #  Profile  host:  trdls.rraka.com
  

刚编辑了代码......

# awk '{print $1,$(NF-2)" "$(NF-1)" "$NF}' bnglr.txt | column -t
    rraka-ged.rraka.com          Profile  host:  trdls.rraka.com
    rraka-avinashj.rraka.com     Profile  host:  trdls.rraka.com

# awk '{print $1" ", substr($0,index($0,$9))}' bnglr.txt |column -t
    rraka-ged.rraka.com          Profile  host:  trdls.rraka.com
    rraka-avinashj.rraka.com     Profile  host:  trdls.rraka.com

即使使用shell / awk或python,我仍然愿意看到任何解决方案。

4 个答案:

答案 0 :(得分:3)

|()等字符是ERE中的元字符,因此您需要使用反斜杠转义它们,使其行为像普通字符

对于给定的示例,您可以使用sed代替默认情况下使用BRE而|()不是特殊的

另见regex differences between different tools

$ sed 's/ | SUCCESS | rc=0 | (stdout)//' ip.txt | column -t
rraka-ged.rraka.com       #  Profile  host:  trdls.rraka.com
rraka-avinashj.rraka.com  #  Profile  host:  trdls.rraka.com


对于一般情况,我建议perl Quoting metacharacters

$ # BRE metacharacters have to be taken care
$ echo '1a.c xabcy 2atc3' | sed 's/a.c//g'
1 xy 23
$ echo '1a.c xabcy 2atc3' | sed 's/a\.c//g'
1 xabcy 2atc3
$ # perl has \Q..\E feature to do that automatically
$ echo '1a.c xabcy 2atc3' | perl -pe 's/\Qa.c//g'
1 xabcy 2atc3

$ # but some characters are still special
$ echo '123a/b$c5467' | perl -pe 's|\Qa/b$c||'
123$c5467
$ # so, most robust solution is to pass the string as env string
$ echo '123a/b$c5467' | s='a/b$c' perl -pe 's/\Q$ENV{s}//'
1235467

答案 1 :(得分:2)

通常,我们处理的文件包含我们可以利用的固有模式。在您的情况下,您希望删除第一个|#之间的任何内容。这通常是sed工作

sed 's/|[^#]*//' casefile_48275106 | column -t
rraka-ged.rraka.com       #  Profile  host:  trdls.rraka.com
rraka-avinashj.rraka.com  #  Profile  host:  trdls.rraka.com

column -t负责格式化显示 希望这有助于: - )

答案 2 :(得分:1)

根据您的问题如何从OP的命令中删除tr命令部分,以下awk解决方案可能对您有所帮助。

awk '{gsub( /SUCCESS|rc=0|stdout/, "") ;a=$1;gsub($1 , "");gsub(/\||\)|\(/,"");print a,$0 }'  Input_file | column -t

编辑: 或者如果你想让它变得更简单,可以帮助你在同样的地方通过简单的字段打印来实现你的输出

awk '{print $1,$(NF-3),$NF}' Input_file  | column -t

答案 3 :(得分:1)

<强> 输入

$ cat infile
rraka-ged.rraka.com | SUCCESS | rc=0 | (stdout) # Profile host: trdls.rraka.com
rraka-avinashj.rraka.com | SUCCESS | rc=0 | (stdout) # Profile host: trdls.rraka.com  

使用awk

$ awk '{gsub(/\|[^#]*/,"")}1' infile | column -t
rraka-ged.rraka.com       #  Profile  host:  trdls.rraka.com
rraka-avinashj.rraka.com  #  Profile  host:  trdls.rraka.com

# OR copy first field and then remove rest all till awk finds #
$ awk '{h=$1; gsub(/^[^#]*/,""); print h,$0}' infile | column -t
rraka-ged.rraka.com       #  Profile  host:  trdls.rraka.com
rraka-avinashj.rraka.com  #  Profile  host:  trdls.rraka.com

# find char # and extract string using substr
$ awk '{print $1, substr($0, index($0,"#"))}'  infile | column -t
rraka-ged.rraka.com       #  Profile  host:  trdls.rraka.com
rraka-avinashj.rraka.com  #  Profile  host:  trdls.rraka.com

使用GNU awk

$ awk '{print gensub(/^([^|]*).*(#.*)/,"\\1 \\2","")}' infile | column -t
rraka-ged.rraka.com       #  Profile  host:  trdls.rraka.com
rraka-avinashj.rraka.com  #  Profile  host:  trdls.rraka.com