首页 > 代码库 > 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}‘
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}‘
linux shell sed awk 命令(2)-awk