LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 774|回复: 8

sed/awk请教[基本解决]

[复制链接]
发表于 2004-6-20 01:39:53 | 显示全部楼层 |阅读模式
有这样一组字串:

  1. 127.0.0.1 10.17.32.162 10.17.32.124 10.17.32.168 127.0.10.1 192.168.177.16
复制代码

实际情况中字串的长度(ip的个数)不一字串中. 现在需要的是将字串中所有的以127开始的ip字段拿掉. 我做的方法是:

  1. echo "127.0.0.1 10.17.32.162 10.17.32.124 10.17.32.168 127.0.10.1 192.168.177.16" | awk '{for(i=1;i<=NF;i++)print $i}' | awk '{if($0 !~ /^127/)print}'
复制代码

思路是将空格符变为换行符再利用awk去除. 可是我总觉得不简洁,不知还有什么更简洁的方法. 请指教. xiexie :thank
发表于 2004-6-20 02:22:35 | 显示全部楼层
str="127.0.0.1 10.17.32.162 10.17.32.124 10.17.32.168 127.0.10.1 192.168.177.16"
按照你的思路:

  1. echo $str|tr ' ' '\n'|grep -v ^127
复制代码

or

  1. echo $str|sed 's/ /\n/g'|sed '/^127/d'
复制代码

or

  1. |awk '{gsub(/ /,"\n");print}'|awk '!/^127/'
复制代码
 楼主| 发表于 2004-6-20 03:47:21 | 显示全部楼层
lee兄, 基本上都是将空格变为空行再对其处理, 有没有直接对这个字串处理的方法呢. 我原用awk将F定为空格, 然后用for和if套用, 但 好象awk不支持这种套用. 比如:
awk '{for(i=1;i<=NF;i++){if($i !~ /^127/)print $i}}'
但不对.
发表于 2004-6-20 10:12:23 | 显示全部楼层
yongjian兄,你的方法可以。你自己看看是否有键入错误。
再给个取巧的方法:

  1. awk 'BEGIN{RS=" ";FS="."}$1 != 127'
复制代码
 楼主| 发表于 2004-6-21 01:45:48 | 显示全部楼层
谢谢教主提醒,是原来的命令有错误. 惭愧, 我还以为强大的awk不支持嵌套语法呢.正确的写法:

  1. str="127.0.0.1 10.17.32.162 10.17.32.124 10.17.32.168 127.0.10.1 192.168.177.16"
  2. echo "$str" | awk -F" " '{for(i=1;i<=NF;i++){if($i !~ /^127/)print $i}}'
复制代码

教主你的方法爽, 利用了将RS和FS重新定义, 省了不少事. 但是不知怎的, 我测试了几遍, 输出结果总是会有空行在最后:

  1. echo "$str" | awk 'BEGIN{RS=" ";FS="."}$1 != 127'
复制代码

为什么呢?
发表于 2004-6-21 01:51:23 | 显示全部楼层
这个爽不爽

  1. /home/lee#for i in $str;do echo $i|grep -v ^127;done
  2. 10.17.32.162
  3. 10.17.32.124
  4. 10.17.32.168
  5. 192.168.177.16
  6. /home/lee#
复制代码
 楼主| 发表于 2004-6-21 02:53:59 | 显示全部楼层
嗯,谢谢lee兄! :thank grep -v 是我最先想到的, 只是正在学sed&awk, 所以遇到了问题总是想找找sed&awk的解决方法.
还有问题: 就是如果用sed的话,好象不转成换行符就无法操作了, 因为sed好象没有重新定义RS的功能, 是吗?
发表于 2004-6-21 03:06:06 | 显示全部楼层
RS是awk的专用变量呀~,至于转不转换行符,那要看输出要求
  1. echo $str|sed 's/127.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}//g;s/^ //;s/  / /g'
复制代码

结果就是:
10.17.32.162 10.17.32.124 10.17.32.168 192.168.177.16
还是教主的awk来的爽 ;)
 楼主| 发表于 2004-6-21 03:22:00 | 显示全部楼层
哦, 这回看明白了. sed 还是可以操作的,不过象这样的情况sed确实是比awk费劲点. 多谢lee兄指教.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表