我试图用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'
答案 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 _]
*
:任意数量的匹配