我的文本文件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
我已通过
awk
和tr
获得此功能,并返回所需内容, 虽然我在寻找是否可以用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,我仍然愿意看到任何解决方案。
答案 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