unix用awk和cut在一起

Unix using awk and cut together

我正在尝试让 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 }' | 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 ,"|",}'|sed s/:/./g|cut -d '.' -f5-8

正如您描述的数据,这应该对您有用

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

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

像下面这样的东西应该会让你接近:

 netstat -an  | awk 'BEGIN{OFS=" | "} ~/3433$/{split(,a,"."); split(,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 个元素,它们之间有一个句点。

您还可以让 awk 通过使用多个定界符来确定一个不同的字段,这也可能适用于此,具体取决于您的需要。

这看起来像:

 netstat -an  | awk -F"[ .]" 'BEGIN{OFS="."} =="3433" { print " | " ,,,}'

直接替换你在awk

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

3433 | 33.44.444.43
3433 | 24.204.101.85
3433 | 11.204.101.85

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

你也可以使用sed:

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