1
2
3
4
5
6
7
8
9
10
11
|
[root@localhost ~]
# cat /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
adm:x:3:4:adm:
/var/adm
:
/sbin/nologin
lp:x:4:7:lp:
/var/spool/lpd
:
/sbin/nologin
sync
:x:5:0:
sync
:
/sbin
:
/bin/sync
shutdown
:x:6:0:
shutdown
:
/sbin
:
/sbin/shutdown
halt:x:7:0:halt:
/sbin
:
/sbin/halt
mail:x:8:12:mail:
/var/spool/mail
:
/sbin/nologin
... ... ...
|
1
|
[root@localhost ~]
# awk -F: '{print $1,$3,$4}' /etc/passwd
|
1
2
|
awk [-F 分隔符] awk指令 输入文件
shell 命令 | awk [-F 分隔符] awk指令
|
1
|
awk -f awk-script-file 输入文件
|
1
2
|
awk
[options]
'script'
file1 file2, ...
awk
[options]
'PATTERN { action }'
file1 file2, ...
|
1
2
3
4
5
|
[root@localhost ~]
# awk '{print $0}' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
... ... ...
|
1
2
3
4
|
[root@localhost ~]
# awk '/bash/' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
mockbuild:x:500:500::
/home/mockbuild
:
/bin/bash
mysql:x:498:498::
/home/mysql
:
/bin/bash
|
1
2
3
4
|
[root@localhost ~]
# awk -F: '/nologin/{print $1,$3}' /etc/passwd | head -3
bin 1
daemon 2
adm 3
|
1
2
3
4
5
|
[root@localhost ~]
# awk -F: '{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
... ... ...
|
1
2
3
4
5
|
[root@localhost ~]
# awk -F: '{print $(NF-1),"ALLEN"}' /etc/passwd
/root
ALLEN
/bin
ALLEN
/sbin
ALLEN
... ... ...
|
1
2
3
4
5
|
[root@localhost ~]
# awk '{print NR,$0}' /etc/passwd
1 root:x:0:0:root:
/root
:
/bin/bash
2 bin:x:1:1:bin:
/bin
:
/sbin/nologin
3 daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
... ... ...
|
1
2
|
[root@localhost ~]
# awk 'BEGIN{print ENVIRON["PATH"];}'
/usr/local/apache/bin
:
/usr/lib64/qt-3
.3
/bin
:
/usr/local/sbin
:
/usr/local/bin
:
/sbin
:
/bin
:
/usr/sbin
:
/usr/bin
:
/root/bin
:
/root/bin
|
1
2
3
4
5
6
7
8
9
|
[root@localhost ~]
# awk -F: -v OFS=. '{print $1,$NF}' /etc/passwd | head -2
root.
/bin/bash
bin.
/sbin/nologin
[root@localhost ~]
# awk -F: -v OFS=\<\> '{print $1,$NF}' /etc/passwd | head -2
root<>
/bin/bash
bin<>
/sbin/nologin
[root@localhost ~]
# awk -F: -v OFS=- '{print $1,$NF}' /etc/passwd | head -2
root-
/bin/bash
bin-
/sbin/nologin
|
变量 | 注释 |
$n | 当前记录的第n个字段,字段间由FS分隔。 |
$0 | 完整的输入记录。 |
ARGC | 命令行参数的数目。 |
ARGIND | 命令行中当前文件的位置(从0开始算)。 |
ARGV | 包含命令行参数的数组。 |
CONVFMT | 数字转换格式(默认值为%.6g) |
ENVIRON | 环境变量关联数组。 |
ERRNO | 最后一个系统错误的描述。 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔)。 |
FILENAME | 当前文件名。 |
FNR | 同NR,但相对于当前文件。 |
FS | 字段分隔符(默认是任何空格)。 |
IGNORECASE | 如果为真,则进行忽略大小写的匹配。 |
NF | 当前记录中的字段数。 |
NR | 当前记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g)。 |
OFS | 输出字段分隔符(默认值是一个空格)。 |
ORS | 输出记录分隔符(默认值是一个换行符)。 |
RLENGTH | 由match函数所匹配的字符串的长度。 |
RS | 记录分隔符(默认是一个换行符)。 |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是\034) |
1
2
3
4
|
修饰符:
-: 左对齐
+: 显示数值符号
N: 显示宽度
|
格式化符 | 注释 |
---|---|
%d | %i 十进制有符号整数 |
$f | 浮点数 |
%s | 字符串 |
%u | 十进制无符号整数 |
%e | %E 科学计数法显示数值 |
%x | %X 无符号以十六进制表示的整数 |
%g | %G 以tuip科学计数法或浮点数的格式显示数值 |
%c | 显示字符的ASCII码 |
%o | 无符号以八进制表示的整数 |
%p | 指针的值 |
%% | 显示%自身 |
1
2
3
4
5
6
7
8
|
[root@localhost ~]
# awk -F: '{printf "%15s %15s\n",$1,$NF}' /etc/passwd | head -3
root
/bin/bash
bin
/sbin/nologin
daemon
/sbin/nologin
[root@localhost ~]
# awk -F: '{printf "%-15s %15s\n",$1,$NF}' /etc/passwd | head -3
root
/bin/bash
bin
/sbin/nologin
daemon
/sbin/nologin
|
1
2
3
4
|
[root@localhost ~]
# awk -F: '{printf "%-15s~%10s ~%15s\n",$1,$3,$4}' /etc/passwd | head -3
root ~ 0 ~ 0
bin ~ 1 ~ 1
daemon ~ 2 ~ 2
|
1
2
3
|
print items > output-
file
print items >> output-
file
print items |
command
|
1
2
3
4
|
/dev/stdin
:标准输入
/dev/sdtout
: 标准输出
/dev/stderr
: 错误输出
/dev/fd/N
: 某特定文件描述符,如
/dev/stdin
就相当于
/dev/fd/0
;
|
1
2
|
[root@localhost ~]
# awk -F: '{printf "%-15s %i\n",$1,$3,$NF > "/root/printf" }' /etc/passwd
[root@localhost ~]
# awk -F: '{printf "%-15s %i\n",$1,$3,$NF}' /etc/passwd > /tmp/printf
|
1
2
3
4
5
6
7
8
9
10
|
操作符 描述
-x 负值
+x 转换为数值
x^y 次方
x**y 次方
x*y 乘法
x
/y
除法
x+y 加法
x-y 减法
x%y 取余
|
1
2
3
4
5
6
|
[root@localhost ~]
# awk '{print $1 $2}' printf | head -2
root0
bin1
[root@localhost ~]
# awk '{print $1$2}' printf | head -2
root0
bin1
|
1
2
3
4
5
6
7
8
9
10
|
操作符 描述
= 赋值操作符
+= 赋值加操作符
-= 赋值减操作符
*= 赋值乘操作符
/= 赋值除操作符
%= 赋值求余操作符
^= 赋值求幂操作符
**= 赋值求幂操作符
注:如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代
|
1
2
3
4
5
6
7
8
9
|
操作符 描述
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
~ 匹配
!~ 匹配取反
|
1
2
|
&& : 逻辑与
|| : 逻辑或
|
1
2
|
[root@localhost ~]
# awk -F: '$3<=100 && $1 $3 ~ /^r/{printf "%-5s %5s\n",$1,$3}' /etc/passwd
root 0
|
1
2
3
4
|
[root@localhost ~]
# awk -F: '$3>=500 || $1 $3 ~ /^m/{printf "%-5s %5s\n",$1,$3}' /etc/passwd
mail 8
mockbuild 500
mysql 498
|
1
2
3
4
5
6
|
selector?
if
-
true
-exp:
if
-
false
-exp
if
selector;
then
if
-
true
-exp
else
if
-
false
-exp
fi
|
1
2
|
[root@localhost ~]
# awk 'BEGIN{Name="welcome to china";print index(Name,"china")?"OK":"NO";}'
OK
|
1
|
function_name (para1,para2)
|
1
2
3
4
5
6
|
常见的模式类型
Regexp: 正则表达式,格式为
/regular
expression/
expresssion: 表达式,其值非0或为非空字符时满足条件,如:$1 ~
/foo/
或 $1 ==
"allen"
,用运算符~(匹配)和!~(不匹配)
Ranges: 指定的匹配范围,格式为pat1,pat2
BEGIN
/END
:特殊模式,仅在
awk
命令执行前运行一次或结束前运行一次
Empty(空模式):匹配任意输入行
|
1
2
3
4
5
6
7
8
|
[root@localhost ~]
# awk -F: '/bash$/{print $1,$3,$NF}' /etc/passwd
root 0
/bin/bash
mockbuild 500
/bin/bash
mysql 498
/bin/bash
[root@localhost ~]
# awk -F: '!/bash$/{print $1,$3,$NF}' /etc/passwd | head -3
bin 1
/sbin/nologin
daemon 2
/sbin/nologin
adm 3
/sbin/nologin
|
1
2
3
4
5
6
|
[root@localhost ~]
# awk -F: '$3~1{print $1,$3}' /etc/passwd | head -3
bin 1
uucp 10
operator 11
[root@localhost ~]
# awk -F: '$3==1{print $1,$3}' /etc/passwd | head -3
bin 1
|
1
2
3
4
|
[root@localhost ~]
# awk -F: '/^bin/,/^adm/{print $1,$3,$NF}' /etc/passwd
bin 1
/sbin/nologin
daemon 2
/sbin/nologin
adm 3
/sbin/nologin
|
1
2
3
4
5
6
7
|
[root@localhost ~]
# awk -F: 'BEGIN{print "UserName:UID"}{print $1,"\t",$3}END{print "===END==="}' /etc/passwd
UserName:UID
root 0
bin 1
... ... ...
mysql 498
===END===
|
1
2
3
4
5
|
[root@localhost ~]
# awk -F: 'BEGIN{print "UserName:UID"}$1 ~ /^d/{printf "%-10s%s\n",$1,$3}END{print "===END==="}' /etc/passwd
UserName:UID
daemon 2
dbus 81
===END===
|
1
2
|
[root@localhost ~]
# awk -F: 'BEGIN{sum=0}$NF ~ /bash$/{count++}END{print "SHELL is Bash:",count}' /etc/passwd
SHELL is Bash: 3
|
1
2
3
4
5
6
7
|
[root@localhost ~]
# awk 'BEGIN{print "All""en"}'
Allen
[root@localhost ~]
# awk -v OFS=- 'BEGIN{print "All","en"}'
All-en
[root@localhost ~]
# awk 'BEGIN{FS=":"}{print $1,$3}' /etc/passwd | head -2
root 0
bin 1
|
1
2
3
4
5
6
7
8
9
10
|
[root@localhost ~]
# awk -F: '{if ($3<500)print $1,"System User";else print $1 "Common User"}' /etc/passwd
root System User
... ... ...
mockbuild Common User
mysql System User
[root@localhost ~]
# awk -F: '{if ($3==0)print $1,"Admin User";else if($3>0 && $3<500){print $1 " System User"}}' /etc/passwd
root Admin User
bin System User
daemon System User
... ... ...
|
1
2
3
4
|
[root@localhost ~]
# awk -F: '{i=1;while(i<=NF){print $i;i+=2}}' /etc/passwd #奇
[root@localhost ~]
# awk -F: '{i=2;while(i<=NF){print $i;i+=2}}' /etc/passwd #偶
[root@localhost ~]
# awk -F: '{for(i=1;i<NF;i+=2)print $i}' /etc/passwd #奇
[root@localhost ~]
# awk -F: '{for(i=2;i<NF;i+=2)print $i}' /etc/passwd #偶
|
1
|
awk
-F:
'{if($3%2==0) next;print $1,$3}'
/etc/passwd
|
1
2
|
[root@localhost ~]
# awk 'BEGIN{A[1]="hello";B[2]="world";print A[1],B[2]}'
[root@localhost ~]
# awk 'BEGIN{A["a"]="hello";B["b"]="world";print A["a"],B["b"]}'
|
1
|
[root@localhost ~]
# netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
|
1
|
awk
-F:
'$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n",A,BASH[A]}}'
/etc/passwd
|
1
2
|
awk
'BEGIN{res=0;i=0;do{res+=i;i++;}while(i<=100)print res;}'
awk
'BEGIN{while(i<=100){res+=i;i++;}print res;}'
|
1
|
awk
'{IP[$1]++}END{for(A in IP)print IP[A],A}'
access_log|sort -rn|head -
6
|
1
|
netstat
-ant |
awk
'/:80\>/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}'
|
sort
-rn |
head
-50
|
1
|
awk
'BEGIN{srand();fr=int(100*rand());print fr;}'
|
1
2
3
4
|
[root@localhost ~]
# awk 'BEGIN{res="welcome to china!";print match(res,/[0-9]+/)?"ok":"no";}'
no
[root@localhost ~]
# awk 'BEGIN{res="welcome to 123 china!";print match(res,/[0-9]+/)?"ok":"no";}'
ok
|
1
2
|
[root@localhost ~]
# awk 'BEGIN{info="welcome to china!";print substr(info,12,5);}'
china
|
1
2
|
[root@localhost ~]
# awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd
[root@localhost ~]
# awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd
|
1
2
3
4
5
6
7
8
9
|
[root@localhost ~]
# awk 'BEGIN{disk=system("df -h");print disk;}'
文件系统 容量 已用 可用 已用%% 挂载点
/dev/mapper/VolGroup-lv_root
50G 12G 36G 24% /
tmpfs 194M 0 194M 0%
/dev/shm
/dev/sda1
485M 45M 416M 10%
/boot
/dev/mapper/VolGroup-lv_home
67G 180M 63G 1%
/home
0
|
1
2
3
4
5
6
|
[root@localhost ~]
# awk 'BEGIN{Tim=mktime("2013 09 04 13 06 26");print strftime("%c",Tim);}'
2013年09月04日 星期三 13时06分26秒
[root@localhost ~]
# date
2013年 09月 04日 星期三 14:09:35 CST
[root@localhost ~]
# awk 'BEGIN{Time=mktime("2013 09 04 13 06 26");Time1=systime();print Time1-Time;}'
3791
|