awk命令
2016-05-18 22:23
405 查看
可以对列和行进行操作,awk有很多内建功能,比如数组,函数等。
结构:
awk由3部分构成,begin,end和带模式匹配选项常见语句块。注意这三部分都是被包含在单引号‘ ’或双引号“ ”之间的。
============
执行步骤:
1,执行BEGIN {commands}语句块中的语句
2,从文件或stdin中读取一行,然后执行pattern {commands},重复这个过程,直到文件全部读取完毕
3,到读到输入流末尾时,执行END {commands}语句块
BEGIN语句块和END语句块都是可选的,BEGIN语句块在开始从输入流中读取行之前执行,常做的工作由变量初始化,打印输出表格等等
END语句块是在从输入流读取完所有的行之后即被执行的行,通常做些扫尾工作。
pattern语句块,可选。如果没有这个语句块,默认是{print },就是打印读取到的一行;awk对于每一行,都会执行这个语句块,就像一个读取行的while循环,在循环体提供了相应的语句。
print语句:当不带参数时,打印输出当前行
当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符
在print语句中,双引号是被当作拼接符号使用的。
===========
特殊变量
NR 当前的记录数量,就是执行过程当前行号
NF 字段数量,对应于当前行的字段数量
$0 这个变量包含执行过程中当前行的文本内容副本
$1 第一个字段的文本内容
$2 第二个字段的文本内容3
awk中printf()函数的语法与c语言中的同名函数一样,可以代替print
=====
将外部变量值传递给awk,使用-v选项
或者利用 从文件读取的思路:如下
3,使用getline读取行,getline var ##var包含特定行的内容
awk默认读取一个文件的所有行,如果只想读取某一行,可以使用getline函数
有时候我们需要在BEGIN语句块中读取第一行
4,使用过滤模式对awk处理行进行过滤
8,最重要的就是awk内建的字符串控制函数了
length(string)
index(string,search_string)
split(string,array,delimiter)
substr(string,start-position,end-position)
sub(regex,replacement_str,string_
gsub(regex,replacement_str,string)
match(regex,string)
结构:
######################################################################### # File Name: awk.sh # Author: lizhen # mail: lizhen_ok@163.com # Created Time: Wed 18 May 2016 09:48:10 PM CST ######################################################################### #!/bin/bash awk ' BEGIN{ i=0 } { i++ } END{ print i } ' n echo $?
awk由3部分构成,begin,end和带模式匹配选项常见语句块。注意这三部分都是被包含在单引号‘ ’或双引号“ ”之间的。
============
执行步骤:
1,执行BEGIN {commands}语句块中的语句
2,从文件或stdin中读取一行,然后执行pattern {commands},重复这个过程,直到文件全部读取完毕
3,到读到输入流末尾时,执行END {commands}语句块
BEGIN语句块和END语句块都是可选的,BEGIN语句块在开始从输入流中读取行之前执行,常做的工作由变量初始化,打印输出表格等等
END语句块是在从输入流读取完所有的行之后即被执行的行,通常做些扫尾工作。
pattern语句块,可选。如果没有这个语句块,默认是{print },就是打印读取到的一行;awk对于每一行,都会执行这个语句块,就像一个读取行的while循环,在循环体提供了相应的语句。
print语句:当不带参数时,打印输出当前行
当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符
在print语句中,双引号是被当作拼接符号使用的。
[lizhen@dhcp-128-93 shell]$ echo | awk '{var1="v1";var2="v2"; print var1,var2}' v1 v2 [lizhen@dhcp-128-93 shell]$ echo | awk '{var1="v1";var2="v2"; print var1 "-" var2}' v1-v2 [lizhen@dhcp-128-93 shell]$
===========
特殊变量
NR 当前的记录数量,就是执行过程当前行号
NF 字段数量,对应于当前行的字段数量
$0 这个变量包含执行过程中当前行的文本内容副本
$1 第一个字段的文本内容
$2 第二个字段的文本内容3
awk中printf()函数的语法与c语言中的同名函数一样,可以代替print
=====
将外部变量值传递给awk,使用-v选项
[lizhen@dhcp-128-93 shell]$ var=1000 [lizhen@dhcp-128-93 shell]$ echo | awk -v VAR=$var '{print VAR}' 1000 [lizhen@dhcp-128-93 shell]$
或者利用 从文件读取的思路:如下
[lizhen@dhcp-128-93 shell]$ var1="var1111";var2="var2222" [lizhen@dhcp-128-93 shell]$ echo | awk '{print v1,v2}' v1=$var1 v2=$var2 var1111 var2222 [lizhen@dhcp-128-93 shell]$
3,使用getline读取行,getline var ##var包含特定行的内容
awk默认读取一个文件的所有行,如果只想读取某一行,可以使用getline函数
有时候我们需要在BEGIN语句块中读取第一行
[lizhen@dhcp-128-93 shell]$ seq 5 | awk 'BEGIN {getline; print "read ahead first line", $0} {print $0}' read ahead first line 1 2 3 4 5 [lizhen@dhcp-128-93 shell]$
4,使用过滤模式对awk处理行进行过滤
8,最重要的就是awk内建的字符串控制函数了
length(string)
index(string,search_string)
split(string,array,delimiter)
substr(string,start-position,end-position)
sub(regex,replacement_str,string_
gsub(regex,replacement_str,string)
match(regex,string)
相关文章推荐
- 机器学习实践指南(五)—— GD/SGD/MSGD 伪代码演示
- Android事件分发机制完全解析(上)
- Linux下QT5.6打开位置
- Swift中的内存管理
- Codeforces--525D--Arthur and Walls(DFS)
- 关于java.util.Vector 或 java.util.Hashtable类过时的讨论
- 第11周补充(4)时间类
- Android wpa_supplicant之--运行方式
- iOS开发系列--UITableView全面解析
- PHP错误Warning: Cannot modify header information - headers already sent by解决方法
- java笔记之类和对象
- [数据库事务与锁]详解七: 深入理解乐观锁与悲观锁
- leetcode_Word Pattern
- Django官方【实例】-简单的全方位例子
- F8App-ReactNative项目源码分析2-服务器端
- 第十三周学习进度表
- 租房子查询练习
- 获取变量名字符串
- 对equals方法和 ==的理解
- Xamarin.Android ListView Item 内部控件Click事件