Linux基础——awk工具

1、awk删选ip字段,通过cut打印ip

# awk截取字段,分隔符管道符“|”左边为第一个打印字符

# cut截取字段,分隔符双引号“"”左边为第一个打印字符

脚本展示:

#!/bin/bash

cat /root/ip.txt | grep "10.139" | awk -F'|' '{print $6}' | cut -d '"' -f8

 

# awk删选ip及掩码字段,cut通过“/”作为分隔符打印第一列
[root@Harbor tmp]# ip a | grep ens33 | awk -F' ' '{print $2}' | cut -d '/' -f1 ens33: 192.168.177.140

2、查找包含字符sshd行,通过“xargs -L”传参右侧echo指令按1列打印

ps -ef | grep sshd | awk '{print $2}' | xargs -L 1 echo

# 左边echo输出字符串,通过xargs -I {}指定传参位置“{}”
echo "file1 file2 file3" | xargs -I {} echo "processing {}"

 3、打印第3行、第5行及以后的行,匹配第9列小于70的行并升序排列;

 sar -u -f .var/log/sa/sa02 |  awk -F ' ' 'NR==3  {print}  NR>=5 && $1!="Average:" && $9 <70 {print} ' |sort -n  -k 4| more

 

注意:
语法报错:awk命令行模块间,以单引号''作为字符分隔符;在单个模块内,以双引号“”作为分隔。

 4、双引号无效输出,{}两边使用双引号不生效

 5、print跟随双引号才能添加所需字符

 6、删选第三列插入字符$3="e f g"

 7、删除行首和行尾的空格、分隔符的空白部分,并每列首字母对齐

awk 'BEGIN{OFS="\t"}{$1=$1;print}' awk_txt

 8、网卡取参:删选除lo网卡以外的所有ipv4地址

ifconfig | awk '/inet / && !($2 ~ /^127/){print $2}'

 9、网卡取参:删选除lo字符以外第六列的ip字符

ifconfig | awk 'BEGIN{RS=""}!/lo/{print $6}'

10、网卡取参:删选网卡名称

ip -4 -o addr show scope global | awk '{print $2, $4}'
结果:ens32 192.168.190.131/24
 说明:
  -4 只看 IPv4
  -o 一行一条记录,好切
  scope global 直接去掉回环/本地链路地址,不用再排除 127

image

 

# 增加可读性
ifconfig
| awk ' /^[^ \t]+:/ {iface=$1; sub(/:$/,"",iface)} /inet / && !($2 ~ /^127/) {printf "网卡: %-8s 地址: %s\n", iface, $2} '
结果:网卡: ens32    地址: 192.168.190.131

image

 

# 增加列名,提高可读性
ip -4 -o addr show scope global \ | awk 'BEGIN{print "序号 网卡 IP 地址/掩码"} {printf "%-4d %-6s %s\n", NR, $2, $4}'
结果:
序号 网卡 IP 地址/掩码
1 ens32 192.168.190.131/24 

image

 11、“-F”选定分隔符,通过!arr[$1]选定第一列去重

awk -F" " '!arr[$1]++{print}' text.txt

 12、打印TCP连接数量

# 打印tcp连接状态,匹配从左往右tcp字符串行并计数存入arr[]数组打印,

netstat -tnap |awk '
/^tcp/{
arr[$6]++
}
END{
for(state in arr){
print state ": " arr[state]
}
}
'

LISTEN: 7
ESTABLISHED: 1

 

# 或

netstat -tnap | awk '/^tcp/{arr[$6]++} END{for(state in arr){print state ":" arr[state]}}'

# 拓展——查找某列中包含的sshd字符串计数并打印

netstat -tnap | awk '/sshd/{arr[$7]++} END{for(state in arr){print state ":" arr[state]}}'

 13、awk加入比较(大于、等于、小于、大于等于、小于等于)

# 大于
sar -r | awk '$9 > 1020992 {print $N}' # 等于 # 小于 # 大于等于 # 小于等于 # 不等于
# 大于和小于
sar -r | awk '$9 > 1020992 || $9 < 100 {print $N}' | sort -rk 9 # 加入if语句

 14、awk磁盘容量消耗单位换算

du -shb /root/bclinux/product/* | awk '{i = $1;size = i/1024/1024/1024;sum = sum + size} END{print  sum "GB"}'

 15、awk匹配关键字和指定分隔符输出

# awk 在读取每一行时,默认会把连续的空格或制表符当作字段分隔符(即 FS 的默认值是 " "),然后按 $1$2……去引用各列。
[root@sysmt Tools]# stat /var/log/sa/sa27 | awk '/Modify/ {print $2}' 2025-10-27 [root@sysmt Tools]# stat /var/log/sa/sa27 | awk -F' ' '/Modify/ {print $2}' 2025-10-27 [root@sysmt Tools]# stat /var/log/sa/sa27 | awk 'BEGIN{FS=" "} /Modify/ {print $2}' 2025-10-27

 16、awk多分隔符切割子字符方法

awk -F多分割符切割字段方法

匹配关键字获取单行字符串 [root@sysmt Tools]#
stat /var/log/sa/sa27 | awk -F'[:]' '/Modify/ {print}' Modify: 2025-10-27 17:50:12.237742372 +0800
主分隔符:“:”
子分隔符:“-”
注意:从左往右,匹配一个分隔符":"算第一个列,即$1,匹配第二个分隔符"-"算第二列,即$2,
以此类推。
单个分隔符冒号“:”
stat /var/log/sa/sa27 | awk -F':' '/Modify/ {print}'
$1 = "Modify"
$2 = " 2025-10-27 17"     ← 注意前面有空格,后面有空格
$3 = "50"
$4 = "12.237742372 +0800"
所以 $3 并不是月份,而是 50多个分隔符“:”或“-”匹配任意一个,陆续记作$1,$2,$3...
stat /var/log/sa/sa27 | awk -F'[:-]' '/Modify/ {print $3}'
-F'[:-]' 表示“冒号 或 连字符”都是分隔符。
同一行被同时按 : 和 - 切开,字段序号变成:
$1 = "Modify"
$2 = " 2025"          ← 年
$3 = "10"             ← 月
$4 = "27 17"
$5 = "50"
$6 = "12.237742372 +0800"
注解:
-F'[:-]'中冒号“:”或中杠“-”匹配任意一个条件作为分隔符:
1、从左往右,第一次匹配冒号“:”作为分隔符,$1 = "Modify"2、第二次匹配中杠“-”作为分隔符,$2 = " 2025"3、第三次匹配中杠“-”作为分隔符,$3 = "10"

 

posted on 2024-05-13 14:22  gkhost  阅读(147)  评论(0)    收藏  举报

导航