Bash 使用awk和cut的Unix

Bash 使用awk和cut的Unix,bash,unix,awk,cut,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

我试图让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
我试图合并两个AWK,但出现了一个错误

这可能吗


谢谢大家!

对于我的系统来说,它是第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

您可以使用awk的功能
split
切入awk。您还可以在awk中使用正则表达式条件过滤记录,使
grep
cut
多余

类似于以下内容的内容应该可以让您接近:

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

  • 将输出字段分隔符设置为两个空间之间的管道
  • 检查第一个字段是否以
    3433结尾
  • 将第一个字段拆分为一个句点,并将结果存储在名为
    a
  • 将第二个字段拆分为一个句点,并将其结果存储在名为
    b
  • 打印数组
    a
    的第5个元素,然后是OFS,然后是数组
    b
    的第1、2、3和4个元素,中间有一个周期
  • 您还可以让awk通过使用多个分隔符来确定不同的字段,根据您的需要,这些分隔符可能也适用于此处

    这看起来像:

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

    awk

    $ ... | 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$/

    您也可以使用
    sed

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

    您的预期输出与您的需求不符!你能再检查一下吗?谢谢!这正是我想要的,当你使用awk时,你永远不需要grep、sed或cut,所以虽然这可能会产生你期望的输出,但这不是一个好的解决方案。