首页 > 代码库 > linux shell sed awk 命令(2)-awk

linux shell sed awk 命令(2)-awk

linux shell sed awk 命令(2)-awk


awk语法格式:

awk [选项] -f program-file [ -- ] file ...

选项:

-F fs, --field-separator fs

制定以fs作为输入行的分隔符(默认分隔符为空格或制表符)


-v var=val, --assign var=val

在执行过程以前,设置一个var值为val


-f program-file, --file program-file

从脚本文件中读取awk指令,以取代在命令参数中输入处理脚本


-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}‘


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}‘



linux shell sed awk 命令(2)-awk