Shell和命令

linux-awk

2017-05-12  本文已影响104人  点点渔火

2017-05-11

来源:

  1. http://man.linuxde.net/awk
  2. 沈剑老师的公众号

awk是一种编程语言, 用于在linux、unix下对文本和数据进行处理, 数据可以来自标准输入(stdin), 一个或多个文件, 或其他命令输出, 它支持用户自定义函数和动态正则表达式等先进功能, 是linux/unix下的一个强大编程工具, 它在命令行中使用, 但更多是作为脚本来使用。awk有很多内建功能,比如数组、函数等, 这是它和C语言的相同之处, 灵活性是awk最大的优势。

awk命令格式和选项


原理:

逐行处理文件中数据

awk 'BEGIN{commands} pattern{commands} END{commands}'

**BEGIN语句块在awk开始从输入流读取行之前被执行, 这是一个可选的语句块, 比如变量初始化、打印表格表头等语句
**

**END语句块在awk从输入流读完所有的行之后被执行,比如打印所有行的分析结果这类信息汇总走势在END语句块中完成,他也是一个可选语句块
**

**pattern语句块中的通用命令是最重要的部分,直接作用于文件的每一行数据,它也是可选的, 如果没有提供pattern语句块,则默认执行{print}, 打印每一行
**

语法:

awk 'pattern + {action}'
# awk '模式 + {操作}' 模式可以省略, 将模式写入{command}中
awk 'NR==20{print $1, $2}'
awk '{if(NR==20)print $1, $2}'

说明:

常用命令选项:

模式:

操作:

**操作是由一个或多个命令、函数、表达式组成,之间由换行符或者分号隔开,并位于{}内**

内置变量:

exp:

cat test | awk '/.*?山$/' 
awk '/^亏/'  test
# 显示匹配hello的行, action默认即为print

# 这个我们可以改写成在模式里面用match函数匹配
awk '{print match($0, /[0-9]+/)?"ok":"no found";}' test
# ?: 符号也是C里面的, /[0-9]+/ 是正则匹配, 输出匹配结果呢?如下, 省略BEGIN语句块
awk '{if(match($0, /山/))print $0}' test


cat hello.txt | awk 'length($0) > 80{parint NR}'
# 打印长度大于80的行数, 注意打印的是行数 print NR行数,如果想打印本身$0
cat hello.txt | awk 'NR==3, NR==5{print $1, $NF}'
# 打印3 ,5 行第一列和最后一列
cat test | awk -F, 'NR==36446{print $1, $NF}'
# 改为中文逗号分割 等同于:
awk -F, 'NR==36446{print $1}' test 
# 或者在BEGIN配置需要的变量,然后pattern选择条件 {command}处理
awk 'BEGIN{FS=","}NR==36446{print $1}' test 
awk 'BEGIN{FS=","}{if(NR==36446)print $1}' test 

其它



写了很多,但是常用的应该是BEGIN{}pattern{}END{}来处理常规的文本数据,日期什么的直接shell就好了
更多详细数据格式 http://man.linuxde.net/awk

上一篇 下一篇

猜你喜欢

热点阅读