linux shell sed awk 命令(2)-awklinux
awk语法格式:正则表达式
awk [选项] -f program-file [ -- ] file ...shell
选项:ide
-F fs, --field-separator fs函数
制定以fs做为输入行的分隔符(默认分隔符为空格或制表符)命令行
-v var=val, --assign var=val文档
在执行过程之前,设置一个var值为valget
-f program-file, --file program-fileit
从脚本文件中读取awk指令,以取代在命令参数中输入处理脚本io
-W compat, -W copyright, --compat, --traditional
使用兼容模式运行awk,GUN扩展选项将被忽略
-W dump-variables[=file], --dump-variables[=file]
打印全局变量(变量,类型,值)到文件中,若是没有提供文件名,则自动输出至名为dump-variables文件中
awk -W dump-variables=out.txt 'x=1 {print x}' test.txt
eg:
1.经过正则表达式/^$/匹配空白行
awk '/^$/ {print "Blank line"}' eth0
2.打印包含主机名的行,没有指定动做指令.默认动做为打印
awk '/HOSTNAME/' /etc/sysconfig/network
3.指定脚本-f
(1)awk.sh内容以下:
/^$/ {print "Blank line"}
(2) awk -f awk.sh eth0
Blank line
Blank line
Blank line
Blank line
Blank line
记录与字段
echo hello world abc | awk '{print $1,$2,$3}'
hello world abc
echo hello world abc | awk '{print $0}'
hello world abc
echo hello world abc | awk '{print NF}'
3
echo hello world abc | awk '{print $NF}'
abc
字段分隔符
awk -F: '{print $1}' /etc/passwd
awk 'BEGIN {FS=":"} {print $1}' passwd
//指定多个分隔符
echo 'hello the:world,!' | awk 'BEGIN {FS="[:, ]"} {print $1,$2,$3,$4}'
内置变量
ARGC 命令行参数
FILENAME 当前输入文档名称
FNR 当前输入文档
NR 输入流的当前记录编号
NF 当前记录字段数
FS 字符分割符
OFS 输出字段分隔符,默认空格
ORS 输出记录分隔符,默认为换行符\n
RS 输入记录分隔符,默认为换行符\n
表达式与操做符
四则运算 + - * /
% 取余 ^ 幂运算
自加自减
++ --
~匹配 !~不匹配
echo "test" | awk 'x=2 {print x+3}'
awk -F: '$1~/root/ {print $3}' /etc/passwd //打印root的ID号
awk -F: '$3>500 {print $1}' /etc/passwd //列出ID号大于500的用户名
awk语法规则
if (表达式)
动做
else
动做
if (表达式) 动做;else 动做
eg:
//判读sda4容量小于20MB时报警,不然显示ok
df -h | grep "sda4" | awk '{if ($4<20000) print "Alart"; else print "OK"}'
while (条件)
动做
语法格式:
x=1
while (i<9) {
print $i
}
eg:
awk 'i=1 {} BEGIN { while (i<=10) { ++i; print i}}' test
do
动做
while (条件)
eg:
awk 'BEGIN { do {++x;print x} while (x<=10) }' test
for ( 变量; 条件; 计数器)
动做
eg:
awk 'BEGIN {for (i=1;i<=10;i++) print i}'
函数
1.rand()
awk 'BEGIN {print rand(); srand();print srand()}'
2.gsub(x,y,z),sub(x,y,z)
awk -F: 'gsub(/root/,"rockycai",$0) {print $0}' /etc/passwd //全局替换
awk -F: 'sub(/root/,"rockycai",$0) {print $0}' /etc/passwd //局部替换
3.length(z)
awk '{print length()}' /etc/passwd //显示passwd每行长度
4.getline
df -h | awk 'BEGIN {print "Disk Free:"}{if(NF==1) {getline;print $3};if(NF==6) print $4}'