如何使用awk或sed

时间:2016-05-10 15:26:27

标签: awk sed tr

我试图用sed,awk或tr或任何方便的快速实用程序从mu命令行输出中删除一些元字符或特殊字符。此外,我已经在我的水平尝试了一些技巧,但它们正在工作但是多次添加命令..正是我在下面得到的......

1)第一个是命令产生的确切输出..

$ getent netgroup login_access_foxone 
login_access_foxone  (-,cacti,) (-,multi,) (-,hipot,) (-,jack,)

2)下面是sed的东西,结合awk产生所需的输出。

$ getent netgroup login_access_foxone | sed 's/login_access_onefarm//g' | sed 's/)/\n/g' | awk 'BEGIN {FS=","}{print $2}' | grep -v ^$
cacti
multi
hipot
jack

3)下面的下一个使用tr命令,但又必须使用cut来获取输出..

$ getent netgroup login_access_foxone | tr -d '(' | tr ')' '\n' | cut -d, -f2
cacti
multi
hipot
jack

4)这是awk,但又分为两部分

$ getent netgroup login_access_foxone | awk -v FS="[()]" '{for (i=2;i<=NF;i+=2) print $i }' | awk -F, '{print $2}'
cacti
multi
hipot
jack

5)很少用sed进行测试,但现在无法删除“ - ”&amp; “,”并在每个名称后面加上换行符

$ getent netgroup login_access_foxone | sed 's/[(),]//g'
login_access_foxone  -cacti -multi -hipot -jack

$ getent netgroup login_access_foxone | sed 's|[()-]||g'
login_access_foxone  ,cacti, ,multi, ,hipot, ,jack,

6)尝试使用一些丑陋的组合,但输出中存在包含空格的问题..

$ getent netgroup login_access_foxone | sed 's/[-,()]/\n/g'
login_access_foxone


cacti




multi




hipot




jack

我知道用下面的代码删除空白行的想法但是agian需要使用另一个管道进行sed ..

$ getent netgroup login_access_foxone | sed 's/[-,()]/\n/g'|sed '/^\s*$/d'

3 个答案:

答案 0 :(得分:3)

awk救援!

$ awk -F, '{for(i=2;i<=NF;i+=2) print $i}' file
cacti
multi
hipot
jack

$ awk -v RS=, '!(NR%2)' file
cacti
multi
hipot
jack

在第二种选择中,我们将每一行分成由逗号分隔的迷你记录。由于必填字段位于两个逗号之间,因此我们将打印出偶数编号的记录,这意味着记录编号可被2整除。订单自然保留(没有惊喜)。

答案 1 :(得分:1)

你可以尝试这个sed,但与awk相比它非常冗长:

sed 's/[^(]*(-,\([^,]*\),)/\1\n/g;s/\n$//' file

答案 2 :(得分:0)

我能想到的最短的解决方案:

grep -Po ',\K\w*'

示例:

grep -Po ',\K\w*'  <<< 'login_access_foxone  (-,cacti,) (-,multi,) (-,hipot,) (-,jack,)'
cacti
multi
hipot
jack

说明:

\K:look-behind

\w:[a-zA-Z _]

*:任意数量的匹配