Unix使用aw​​k和切割在一起

时间:2017-01-26 20:13:34

标签: bash unix awk cut

我想让netstat,awk和cut一起工作来解析netstat输出的两个部分

我想只提取第一列的最后4个数字:

 11.111.222.32.3433   
 10.204.101.85.3433
 10.204.101.85.3433

我能够做到:

netstat -an |grep 3433 |awk '{print $1}' | cut -d "." -f5

但我也想要打印第二列,但不记下最后4个数字

示例:

 33.44.444.43.5555   
 24.204.101.85.3434
 11.204.101.85.6533

所以我希望最终输出看起来像

3433 | 33.44.444.43
3433 | 24.204.101.85
3433 | 11.204.101.85

我试图合并两个awks,但是我收到错误

这可能吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

对于我的系统来说,它是第4栏,第5段,所以以下为我工作:

$ netstat -an|grep 3433|awk '{print $4,"|",$5}'|sed s/:/./g|cut -d '.' -f5-8

正如您描述的数据一样,这应该适合您

$ netstat -an|grep 3433|awk '{print $1,"|",$2}'|cut -d '.' -f5-8

答案 1 :(得分:0)

你可以使用awk的函数split切入awk。您还可以使用awk中的正则表达式条件过滤记录,从而使grepcut变得多余。

以下内容应该让您接近:

 netstat -an  | awk 'BEGIN{OFS=" | "} $1~/3433$/{split($1,a,"."); split($2,b,"."); print a[5], b[1]"."b[2]"."b[3]"."b[4] }'

这就像:

  1. 将输出字段分隔符设置为两个空格之间的管道
  2. 检查第一个字段,看它是否以3433
  3. 结尾
  4. 按句点拆分第一个字段,并将结果存储在名为a
  5. 的数组中
  6. 按期间拆分第二个字段,并将其结果存储在名为b
  7. 的数组中
  8. 打印出数组a的第5个元素,然后是OFS,然后是数组b的第1,第2,第3和第4个元素,它们之间有句点。
  9. 您也可以通过使用多个分隔符来确定一个不同的字段,这可能也适合这里,具体取决于您的需要。

    这看起来像是:

     netstat -an  | awk -F"[ .]" 'BEGIN{OFS="."} $5=="3433" { print $5" | " $6,$7,$8,$9}'
    

答案 2 :(得分:0)

awk

中直接替换你的grep
$ ... | awk -v OFS=' | ' '/3433/{sub(/.*\./,"",$1); sub(/\.[^.]+$/,"",$2)}1'

3433 | 33.44.444.43
3433 | 24.204.101.85
3433 | 11.204.101.85

但是,您应该检查$1~/3433$/

答案 3 :(得分:0)

您还可以使用sed

echo " 33.44.444.43.5555
 24.204.101.85.3434
 11.204.101.85.6533" | sed 's/\(.*\)\.\([^.]*\)$/\2 | \1/'