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 中使用正则表达式条件过滤记录,从而使 grep
和 cut
变得多余。
像下面这样的东西应该会让你接近:
netstat -an | awk 'BEGIN{OFS=" | "} ~/3433$/{split(,a,"."); split(,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="."} =="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/\(.*\)\.\([^.]*\)$/ | /'
我正在尝试让 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 中使用正则表达式条件过滤记录,从而使 grep
和 cut
变得多余。
像下面这样的东西应该会让你接近:
netstat -an | awk 'BEGIN{OFS=" | "} ~/3433$/{split(,a,"."); split(,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="."} =="3433" { print " | " ,,,}'
直接替换你在awk
$ ... | 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/\(.*\)\.\([^.]*\)$/ | /'