grep: 文本过滤器
    grep 'pattern' input_file ...

sed:流编辑器

awk: 报告生成器
    格式化以后,显示

AWK a.k.a. Aho, Kernighan and Weinberger

new awk: nawk

gawk, awk

# awk [options] 'script' file1 file2, ...
# awk [options] 'PATTERN { action }' file1 file2, ...
awk -F: 'BEGIN{OFS="#"}{print $2,"hello",$1}' /etc/passwd

print, printf

-F

awk的输出:

一、print
print的使用格式:
    print item1, item2, ...
要点:
1、各项目之间使用逗号隔开,而输出时则以空白字符分隔;
2、输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;
3、print命令后面的item可以省略,此时其功能相当于print $0, 因此,如果想输出空白行,则需要使用print "";

例子:
# awk 'BEGIN { print "line one\nline two\nline three" }'
awk -F: '{ print $1, $3 }' /etc/passwd

二、awk变量

2.1 awk内置变量之记录变量:
FS: field separator,读取文件本时,所使用字段分隔符;
RS: Record separator,输入文本信息所使用的换行符;
OFS: Output Filed Separator: 输出字段所使用的分隔符
ORS:Output Row Separator:输出行所使用的分隔符

awk -F:  输入分隔符
OFS="#":输出分隔符
FS=":" 输入分隔符

aaarticlea/png;base64,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" alt="" />
2.2 awk内置变量之数据变量:
NR: The number of input records,awk命令所处理的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数;

[root@localhost ~]# awk '{print NR}' test.txt /etc/fstab
1
2
3
4
5
6
7
8
9
10
11
12

NF:Number of Field,当前记录的field个数;

[root@localhost ~]# awk '{print NF}' test.txt
4
2
[root@localhost ~]# awk '{print $NF}' test.txt
test
awk

FNR: 与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;

[root@localhost ~]# awk '{print FNR}' test.txt /etc/fstab
1
2
1
2
3
4
5
6
7

ARGV: 数组,保存命令行本身这个字符串,如awk '{print $0}' a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC: awk命令的参数的个数;
FILENAME: awk命令所处理的文件的名称;
ENVIRON:当前shell环境变量及其值的关联数组;

如:awk 'BEGIN{print ENVIRON["PATH"]}'

2.3 用户自定义变量

gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写。

2.3.1 在脚本中赋值变量

在gawk中给变量赋值使用赋值语句进行,例如:
awk 'BEGIN{var="variable testing";print var}'

2.3.2 在命令行中使用赋值变量

gawk命令也可以在“脚本”外为变量赋值,并在脚本中进行引用。例如,上述的例子还可以改写为:
awk -v var="variable testing" 'BEGIN{print var}'

三、printf
printf命令的使用格式:
printf format, item1, item2, ...

要点:
1、其与print命令的最大不同是,printf需要指定format;
2、format用于指定后面的每个item的输出格式;
3、printf语句不会自动打印换行符;\n

format格式的指示符都以%开头,后跟一个字符;如下:
%c: 显示字符的ASCII码;

[root@localhost ~]# awk 'BEGIN{var="l";printf "%c\n",var}'
l

%d, %i:十进制整数;
%e, %E:科学计数法显示数值;
%f: 显示浮点数;
%g, %G: 以科学计数法的格式或浮点数的格式显示数值;
%s: 显示字符串;

[root@localhost ~]# awk 'BEGIN{var="lalala";printf "%s\n",var}'
lalala

%u: 无符号整数;
%%: 显示%自身;

修饰符:
N: 显示宽度;
-: 左对齐;
+:显示数值符号;

[root@localhost ~]# awk 'BEGIN{var="lalala";printf "%10s\n",var}'
lalala //前面有四个空白字符
[root@localhost ~]# awk 'BEGIN{var="lalala";printf "%-10s\n",var}'
lalala //后面有四个空白字符
[root@localhost ~]# awk '{printf "%-10s%-10s\n",$1,$2}' test.txt
this      is        
hello     awk       
[root@localhost ~]# awk '{printf "%-10s,%-10s\n",$1,$2}' test.txt
this      ,is        
hello     ,awk       

例子:
# awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd

四、输出重定向

print items > output-file
print items >> output-file
print items | command

特殊文件描述符:
/dev/stdin:标准输入
/dev/sdtout: 标准输出
/dev/stderr: 错误输出
/dev/fd/N: 某特定文件描述符,如/dev/stdin就相当于/dev/fd/0;

例子:
# awk -F: '{printf "%-15s %i\n",$1,$3 > "/dev/stderr" }' /etc/passwd

六、awk的操作符:

6.1 算术操作符:

-x: 负值
+x: 转换为数值;
x^y:
x**y: 次方
x*y: 乘法
x/y:除法
x+y:
x-y:
x%y:

6.2 字符串操作符:
只有一个,而且不用写出来,用于实现字符串连接;

6.3 赋值操作符:
=
+=
-=
*=
/=
%=
^=
**=

++
--

需要注意的是,如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代;

6.4 布尔值

awk中,任何非0值或非空字符串都为真,反之就为假;

6.5 比较操作符:
x < y    True if x is less than y.
x <= y    True if x is less than or equal to y.
x > y    True if x is greater than y.
x >= y    True if x is greater than or equal to y.
x == y    True if x is equal to y.
x != y    True if x is not equal to y.
x ~ y    True if the string x matches the regexp denoted by y.
x !~ y    True if the string x does not match the regexp denoted by y.
subscript in array      True if the array array has an element with the subscript subscript.

6.7 表达式间的逻辑关系符:
&&
||

6.8 条件表达式:
selector?if-true-exp:if-false-exp

if selector; then
  if-true-exp
else
  if-false-exp
fi

a=3
b=4
a>b?a is max:b ia max

6.9 函数调用:
function_name (para1,para2)

七 awk的模式:

awk 'program' input-file1 input-file2 ...
其中的program为:
pattern { action }
pattern { action }
...

7.1 常见的模式类型:
1、Regexp: 正则表达式,格式为/regular expression/

[root@localhost ~]# awk '/^r/{print $1}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind
rpcuser:x:29:29:RPC
rtkit:x:496:495:RealtimeKit:/proc:/sbin/nologin

2、expresssion: 表达式,其值非0或为非空字符时满足条件,如:$1 ~ /foo/ 或 $1 == "magedu",用运算符~(匹配)和!~(不匹配)。

[root@localhost ~]# awk -F: '$3>=500{print $1,$3}' /etc/passwd
nfsnobody 65534
tom 500
hadoop 501
mandriva 4004
fedora 2003
openstack 4005
hive 5000
[root@localhost ~]# awk -F: '$3+1>=500{print $1,$3}' /etc/passwd
nfsnobody 65534
saslauth 499
tom 500
hadoop 501
mandriva 4004
fedora 2003
openstack 4005
hive 5000
[root@localhost ~]# awk -F: '$7~"bash$"{print $7}' /etc/passwd
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
[root@localhost ~]# awk -F: '$7~/bash$/{print $7}' /etc/passwd
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
[root@localhost ~]# awk -F: '$7~/bash$/{print $1,$7}' /etc/passwd
root /bin/bash
mysql /bin/bash
tom /bin/bash
apache /bin/bash
hadoop /bin/bash
mandriva /bin/bash
openstack /bin/bash
hive /bin/bash
[root@localhost ~]# awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
uucp /sbin/nologin
operator /sbin/nologin

3、Ranges: 指定的匹配范围,格式为pat1,pat2

[root@localhost ~]# awk -F: '$3==0,$7~"nologin"{print $1,$7}' /etc/passwd
root /bin/bash
bin /sbin/nologin

4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次(例如:加表头表尾)
5、Empty(空模式):匹配任意输入行;

7.2 常见的Action
1、Expressions:
2、Control statements控制语句

3、Compound statements复合语句
4、Input statements
5、Output statements

/正则表达式/:使用通配符的扩展集。

关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

模式匹配表达式:

模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。

BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

END:让用户在最后一条输入记录被读取之后发生的动作。

八 控制语句:
8.1 if-else
语法:if (condition) {then-body} else {[ else-body ]}
例子:
awk -F: '{if ($1=="root") print $1, "Admin"; else print $1, "Common User"}' /etc/passwd
awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin"; else printf "%-15s: %s\n", $1, "Common User"}' /etc/passwd
awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd

8.2 while
语法: while (condition){statement1; statment2; ...}
awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd
awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}' /etc/passwd

8.3 do-while
语法: do {statement1, statement2, ...} while (condition)
awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd

8.4 for
语法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}
awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd
awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd

for循环还可以用来遍历数组元素:
语法: for (i in array) {statement1, statement2, ...}
awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n",A,BASH[A]}}' /etc/passwd

8.5 case
语法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}

8.6 break 和 continue
常用于循环或case语句中

8.7 next
提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:
# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd

九 awk中使用数组

9.1 数组

array[index-expression]

index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。

要遍历数组中的每一个元素,需要使用如下的特殊结构:
for (var in array) { statement1, ... }
其中,var用于引用数组下标,而不是元素值;

例子:
netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
每出现一被/^tcp/模式匹配到的行,数组S[$NF]就加1,NF为当前匹配到的行的最后一个字段,此处用其值做为数组S的元素索引;

awk '{counts[$1]++}; END {for(url in counts) print counts[url], url}' /var/log/httpd/access_log
用法与上一个例子相同,用于统计某日志文件中IP地的访问量

9.2 删除数组变量

从关系数组中删除数组索引需要使用delete命令。使用格式为:

delete  array[index]

十、awk的内置函数

split(string, array [, fieldsep [, seps ] ])
功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从0开始的序列;

netstat -ant | awk '/:80\>/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50

length([string])
功能:返回string字符串中字符的个数;

substr(string, start [, length])
功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;

system(command)
功能:执行系统command并将结果返回至awk命令

systime()
功能:取系统当前时间

tolower(s)
功能:将s中的所有字母转为小写

toupper(s)
功能:将s中的所有字母转为大写

十一、用户自定义函数

自定义函数使用function关键字。格式如下:

function F_NAME([variable])
{
    statements
}

函数还可以使用return语句返回值,格式为“return value”。

awk笔记1的更多相关文章

  1. Sed&awk笔记之sed篇

    http://blog.csdn.net/a81895898/article/details/8482387 Sed是什么 <sed and awk>一书中(1.2 A Stream Ed ...

  2. Sed&awk笔记之sed篇(转)

    Sed是什么 <sed and awk>一书中(1.2 A Stream Editor)是这样解释的: Sed is a "non-interactive" strea ...

  3. awk笔记

    http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591842.html awk实例练习 http://www.cnblogs.com/repo ...

  4. Sed&awk笔记之awk篇

    http://blog.csdn.net/a81895898/article/details/8482333 Awk是什么 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但 ...

  5. Sed&awk笔记之awk篇(转)

    Awk是什么 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备 ...

  6. 【Linux】awk笔记

    awk是一种处理文本文件的语言,是一个强大的文本分析工具. 实例 ①显示文件行中匹配项 # 每行按空格或TAB分割,输出文本中的1.4项 yunduo@yunduo-ThinkCentre-XXXX: ...

  7. awk-实践

    实际中遇到的问题 字符串截取函数 substr #!/usr/bin/awk #author:zhaoyingnan #filename:substr.awk #substr 函数 #|awk -f ...

  8. sed原理及使用

    前言 环境:centos6.5 sed版本:GNU sed version 4.2.1 本文的代码都是在这个环境下验证的. 一.简介 sed(Stream Editor)意为流编辑器,是Unix常见的 ...

  9. sed替换换行符“\n”

    linux sed命令,如何替换换行符“\n” 在一次sed使用中,执行命令: sed "s/\n//g" file 1 发现,没起到任何效果. 后来,经查sed官方用户手册,才得 ...

随机推荐

  1. poj 2184 Cow Exhibition(dp之01背包变形)

    Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - ...

  2. hdu 5410 CRB and His Birthday(混合背包)

    Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...

  3. hdu 5402 Travelling Salesman Problem(大模拟)

    Problem Description Teacher Mai ,) to the bottom right corner (n,m). He can choose one direction and ...

  4. python进阶之路4.1---生成器与迭代器

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. CSS基础知识笔记(一)

    css 样式由选择符和声明组成,而声明又由属性和值组成: 选择符: 又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色,而其他的元素(如ol)不会受到影响. 声 ...

  6. js图片放大镜特效代码

    <script language="JavaScript"> <!-- var srcX = 1024; //原图长宽 var srcY = 768; var b ...

  7. (三)原生JS实现 - 插件 - 弹出层

    创建遮罩层 _createCover: function() { var newMask = document.createElement("div"); newMask.id = ...

  8. 大家来找茬-SpringMVC中Tomcat正常启动,始终访问不了Controller,出404错

    创建了一个空的SpringMVC项目,Tomcat可以正常启动,但是运行的时候,始终进不了Controller,并且报404错误. 百度各种查,结果也是查不到原因.各个群里面各种求,各种贴源码,也没有 ...

  9. uva11426 欧拉函数应用

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=121873#problem/F 题目大意:给你一个数n,让你输出(i=1-> ...

  10. IT编程培训,线上线下,孰优孰劣

    现在Java培训机构确实参差不齐,主要有在线培训和线下培训两大类: 1,虚拟和现实的区别:不论视觉,听觉,体验上在线教学都不如线下教学. 2,学费问 题:在线教学由于成本低,不受地域,教学设备限制一般 ...