linux shell sed awk 命令(2)-awk

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


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

相关文章
相关标签/搜索