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

# 增加列名,提高可读性
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

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";
稳步前行,只争朝夕。
浙公网安备 33010602011771号