如何使用 awk 或 sed 删除多个元字符
How to remove multiple meta characters with awk or sed
我正在尝试使用 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 }' | 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 }'
cacti
multi
hipot
jack
5) 对 sed 进行了一些测试,但现在无法删除“-”和“,”并在每个名称后换行
$ 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) 尝试使用一些丑陋的组合进行 sed,但输出包含空格时出现问题..
$ 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'
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
在第二种选择中,我们将每一行拆分为以逗号分隔的迷你记录。由于必填字段在两个逗号之间,我们将打印出偶数记录,这意味着记录号可以被二整除。订单自然保留(没有惊喜)。
您可以试试这个 sed,但与 awk 相比它相当冗长:
sed 's/[^(]*(-,\([^,]*\),)/\n/g;s/\n$//' file
我能想到的最短的解决方案:
grep -Po ',\K\w*'
示例:
grep -Po ',\K\w*' <<< 'login_access_foxone (-,cacti,) (-,multi,) (-,hipot,) (-,jack,)'
cacti
multi
hipot
jack
解释:
\K
: 回顾
\w
: [a-zA-Z_]
*
:任意数量的匹配
我正在尝试使用 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 }' | 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 }'
cacti
multi
hipot
jack
5) 对 sed 进行了一些测试,但现在无法删除“-”和“,”并在每个名称后换行
$ 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) 尝试使用一些丑陋的组合进行 sed,但输出包含空格时出现问题..
$ 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'
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
在第二种选择中,我们将每一行拆分为以逗号分隔的迷你记录。由于必填字段在两个逗号之间,我们将打印出偶数记录,这意味着记录号可以被二整除。订单自然保留(没有惊喜)。
您可以试试这个 sed,但与 awk 相比它相当冗长:
sed 's/[^(]*(-,\([^,]*\),)/\n/g;s/\n$//' file
我能想到的最短的解决方案:
grep -Po ',\K\w*'
示例:
grep -Po ',\K\w*' <<< 'login_access_foxone (-,cacti,) (-,multi,) (-,hipot,) (-,jack,)'
cacti
multi
hipot
jack
解释:
\K
: 回顾
\w
: [a-zA-Z_]
*
:任意数量的匹配