awk
2022/7/12原创大约 3 分钟约 859 字
跳过指定行并输入行号
lsof -i:6379|awk 'NR>1{print NR,$1,"|",$2}'
输入分隔符
awk '{print $1,"|",$2}'
相关信息
打印输出如果需要指定分隔符,可进行拼接
跳过指定行
awk 'NR>1{print $1}' test.txt
输出指定分隔符
awk -F, '{print $1}'
内置变量
属性 | 说明 |
---|---|
$0 | 当前记录(作为单个变量) |
$1~$n | 当前记录的第n个字段,字段间由FS分隔 |
FS | 输入字段分隔符 默认是空格 |
NR | 当前的行号 |
FN | 最后一列的值。 |
NR | 已经读出的记录数,就是行号,从1开始 |
RS | 输入的记录他隔符默 认为换行符 |
OFS | 输出字段分隔符 默认也是空格 |
ORS | 输出的记录分隔符,默认为换行符 |
ARGC | 命令行参数个数 |
ARGV | 命令行参数数组 |
FILENAME | 当前输入文件的名字 |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
ARGIND | 当前被处理文件的ARGV标志符 |
CONVFMT | 数字转换格式 %.6g |
ENVIRON | UNIX环境变量 |
ERRNO | UNIX系统错误消息 |
FIELDWIDTHS | 输入字段宽度的空白分隔字符串 |
FNR | 当前记录数 |
OFMT | 数字的输出格式(默认值是%.6g) |
RSTART | 被匹配函数匹配的字符串首 |
RLENGTH | 被匹配函数匹配的字符串长度 |
SUBSEP | 数组下标分隔符(默认值是\034) |
root开头的那一行
awk '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
/^root/ 为选择表达式,
^root表示以root开头
$0 代表整行 $1代表第一个区域,依此类推
设置字段分隔符号(FS使用方法)
[root@entel2 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
root /bin/bash
[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print $2,$NF}' /etc/passwd
x /bin/bash
[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print $0,$NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash /bin/bash
[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print $6,$NF}' /etc/passwd
/root /bin/bash
相关信息
FS为字段分隔符,可以自己设置,默认是空格,因为passwd里面是”:”分隔,所以需要修改默认分隔符。
NF是字段总数,$0代表当前行记录,$1-$n是当前行,各个字段对应值。
$NF 最后一列的值。
记录条数(NR,FNR使用方法)
[root@entel2 ~]# awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /etc/passwd
1 root /bin/bash
2 bin /sbin/nologin
3 daemon /sbin/nologin
4 adm /sbin/nologin
5 lp /sbin/nologin
6 sync /bin/sync
7 shutdown /sbin/shutdown
8 halt /sbin/halt
9 mail /sbin/nologin
10 uucp /sbin/nologin
设置输出字段分隔符(OFS使用方法)
指定分隔符为^^
[root@entel2 ~]# awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd
1^^root^^/bin/bash
默认字段分隔符:
[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print FNR,$1,$NF}' /etc/passwd
1 root /bin/bash
OFS设置默认字段分隔符
设置输出行记录分隔符(ORS使用方法)
cat /etc/passwd|head -n 5|awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}'
[root@entel2 ~]# cat /etc/passwd|head -n 5|awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}'
1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^4 adm /sbin/nologin^^5 lp /sbin/nologin^^
ORS默认是换行符,这里修改为:”^”,所有行之间用”^”分隔了。
过滤数据
tail -100f trace.log |grep "Thread-121" |awk -F' ' '{if($10 > 0)print $10,$18}'
获取指定行数据
awk 'NR==5,NR==10{print NR,$0}' MOM_SCLS_B_ALL_20180813103947.dat
默认输出分隔符
ifconfig eth0|awk 'NR==2{print $2}'|awk -F ':' -v OFS="," '{print $1,$2}'
格式化输出
awk -F ":" 'BEGIN{print"用户名\t\t\t字段1\t\t 字段2\t\t 权限"}/sbin:/{printf "user:%-20s%-20s%-20s%-20s\n", $1,$4,$5,$7}' /etc/passwd