首页 > 代码库 > 高效awk编程第四版学习笔记
高效awk编程第四版学习笔记
How to Run awk Programs
语法:
awk ‘program‘ input-file1 input-file2 适用于短program
awk -f program-file input-file1 input-file2 用在长program
awk是输入驱动的,也就是说没有输入就结束
awk模型:把输入的每一行进行检查是否满足pattern,如果满足就执行action,如果不满足,下一行处理,直到文件的末尾。另外一种模式就是BEGIN和END,这两个在主循环体内只执行一次。
Running Long Programs时
awk -f source-file input-file1 input-file2
eg:BEGIN { print "Don‘t Panic!" }将此语句写入advice文件,然后执行awk -f advice
does the same as this one: awk ‘BEGIN { print "Don\47t Panic!" }‘
Exec awk Programs
使用文件写programs时,.awk文件要写明"#!" like this file:
#! /bin/awk -f
BEGIN { print "Don‘t Panic!" }
$chmod +x advice
$advice
Don‘t Panic!
如果$PATH没有也就是直接敲advice不行,你就需要./advice执行
awk is an interpreted language so used "#!"
Comments in awk Programs 在awk中注释 # like this
# This program prints a nice,friendly message. It helps
# keep novice users from begin afraid of the computer.
BEGIN { print "Don‘t Panic!" }
但是写在短program后面的注释就有语法错误 eg: awk ‘BEGIN { print "hello" } #let‘s be cute‘
shell quoting issues 单引号开始结束‘‘,里边的显示用双引号"",如果使用了双引号开始与结束,那么里边的print显示要用\"转义双引号,like this
awk ‘BEGIN { print "Don\47t Panic!"}‘
awk "BEGIN { print \"Don‘t Panic!\"}"
FS note 以及多重引号问题
awk -FS"" ‘{ print "hello" } wrong
awk -FS "" ‘{ print "hello" } right
Amelia 555-5553 amelia.zodiacuseque@gmail.com F
Anthony 555-3412 anthony.asserturo@hotmail.com A
Bill 555-7685 bill.drowning@hotmail.com A
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
匹配li并显示
模式匹配即parttern有以下几种:
正则表达式 /^r/
表达式 length($0) >100 $6 == "Nov"
匹配$0 ~ "a"
awk ‘/li/{print $0}‘ mail-list
awk ‘length($0) >80‘ data 默认awk不写print也会执行print $0
awk ‘{ if(length($0) >max) max = length($0)}END{print max}‘ date 打印最大长度的变量
awk ‘{ if(x <length($0)) x=length($0)} END{print mix}‘ data 打印最小的那个
awk ‘NF > 0‘ data 打印每一行
awk ‘BEGIN { for (i=1;i<=7;i++) print int(101*rand())}‘ 打印7个0-100随机数
ls -l | awk ‘{x+=$5} END{print "total K-bytes : " x/1024}‘ 打印总字节数
awk -F ":" ‘{ print $1}‘ /etc/passwd | sort 打印排序后用户名
awk ‘END{print NR}‘ data 打印文件总行数区别于FNR
awk ‘NR%2==0‘ data打印偶数行
以上都是单一规则rules
awk ‘/12/ {print $0};/21/{print $0}‘ mail-list inventory-shipped
有两个规则,那么如果一条数据既满足12又满足21,那么就会显示两条一样数据
A More Complex Example
ls -l | awk ‘$6 == "Nov" {sum+=5;} END{print sum}‘
调用awk
awk [options] -f progfile [--] file ...
awk [options] [--] ‘program‘ file ...
标准参数
-F --field-separator
-f --source-file
-v --var=val
读取标准输入和其他文件的时候用,用“-”参数like this:
some_command | awk -f myprog.awk file1 - file2
先读取file1 然后读取some_command的输入 再读取file2
http://www.iqiyi.com/v_19rrlyojhc.html?vfm=m_332_bing引入其他的文件 @include "filename"
namely test1 and test2
test1 script:
BEGIN { print "This is script test1" }
and here is test2:
@include "test1"
BEGIN { print "This is script test2." }
$gawk -f test2
This is script test1
This is script test2
How to Use 有规律的表达式
语法:exp ~ /regexp/
awk ‘$1 ~ /J/‘ inventory-shipped 第一个字段匹配“J”
like this : awk ‘{ if ($1 ~ /J/) print }‘ inventory-shipped
语法:exp !~ /regexp/
awk ‘$1 !~ /J/‘ inventory-shipped 第一个字段不匹配“J”
Escape Sequences 在输出 ” 跟 \ 时候一定要用 \ 进行转义
必备一些正则知识,...{n,m} + * ? |
-F 指定这些为分隔符时用 \进行转义 \ ] - ^ put a ‘\‘ in front of it
eg: [d\]] 指定以d分割或者]分割
echo ‘xxAA xxBxx C‘ | gawk -F ‘(^x+)|( +)‘ ‘{for (i=1;i<=NF;i++) printf "--->%s<--",$i}‘
指定多个分隔符以后,首先判断空格,如果没有再以表达式为准,以设置的最多为准,输出
--><--
-->AA<--
-->xxBBxx<--
-->C<--
OFS ORS FS RS
print items >> output-file
print items | command
print items | & command
awk ‘{ print $1 > "names.unsorted"
command = "sort -r > names.sorted"
print $1 | command }‘ mail-list
/dev/stdin The standard input (file descriptor 0)
/dev/stdout The standard output (file descriptor 1)
/dev/stderr The standard error output (file descriptor 2)
close(filename)
close(command)
不能获取以上两个函数的返回值,如果获取会报错
"sort -r names" | getline foo
then you must close it with this:
close("sort -r names")
本文出自 “运维邦” 博客,谢绝转载!
高效awk编程第四版学习笔记