shell编程之awk
awk是一种用于处理数据和生成报告的编程语言
awk可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题
awk与grep、sed结合使用,将使shell编程更加容易
awk工作模式:
awk逐行扫描输入(可以是文件与管道),按给定的模式查找出匹配的行,然后对这些执行awk命令指定的操作
与sed一样,awk不会修改输入文件的内容。awk多了一个对列的处理,如果要处理列,awk是一个好的选择。可以使用重定向将awk的输出保存到文件中。
一、awk简单用法
awk [options] awk_cmd files
选项 :-F 指定输入记录字段的分隔符,默认使用环境变量IFS的值。
-f 从指定文件读取awk_script
-v 为awk设定变量
例如:
$1表示第一列。$0表示整行。
awk -F: '{print $1}' /etc/passwd :以冒号为分隔符,输出/etc/passwd中每行第一列内容
awk -F: '{print $1,$3}' /etc/passwd :以冒号为分隔符,输出/etc/passwd中每行第一列与第三列(默认空格分割)
awk -F: '{print $1 "|" $3}' /etc/passwd :输出/etc/passwd中每行第一列与第三列,且两列之间用|分隔
awk -F: '/^root/{print $1 "|" $3}' /etc/passwd :行首匹配root的行,输出这些行第一列与第三列,且两列之间用|分隔
二、awk脚本用法:
-f 从指定文件读取awk_script。
其中awk_script语法:
awk 'BEGIN {actions}
/pattern1/{actions} 命令1
......
/patternN/{actions} 命令N
END {actions}' input_file
BEGIN{actions}与END{actions}可选,awk_script可以由一条或多条awk_cmd组成,每天awk_cmd各占一行。
每个awk_cmd由两部分组成:/pattern/{actions}。其中/pattern/和{actions}可以省略,但不能同时省略;/pattern/省略时表示对所有的输入行执行指定的actions;
{actions}省略时,表示打印符合pattern的所有整行。
awk脚本的执行过程:
1、如果存在BEGIN,awk首先会执行它指定的actions
2、awk从输入中读取一行,称为一条输入记录
3、awk将读入的记录分割成数个字段,并将第一个放入变量$1中,第二个放入$2中,依此类推。$0表示整条记录;字段分割符可以通过选项-F指定,否则使用缺省的分隔符
4、把当前输入记录依次与每一个awk_cmd中的pattern比较:如果相匹配,就执行对应的actions
如果不匹配,就跳过对应的actions,直到完成所有的awk_cmd
5、当一条输入记录处理完毕,awk读取输入的下一行,重复上面的处理过程,直到所有输入全部处理完毕。
6、awk处理完所有的输入后,若存在END,执行相应的actions。
7、如果输入是文件列表,awk将按顺序处理列表中的每个文件。
下面举个例子:
ifconfig | awk '/inet addr/{print $2}' | awk -F: '{print $2}' :查找ip地址
三、awk模式匹配:
1、使用正则表达式
^:只匹配行首(可以看成是行首标志)
$:只匹配行尾(可以看成是行尾标志)
*:一个单字符后紧跟*号,可匹配0个或多个此字符
[ ]:匹配[ ]内任意一个字符([^ ]反向匹配)
\:用来屏蔽一个元字符的特殊含义
.:匹配任意单个字符
str1|str2:匹配str1或str2
+:匹配一个或多个前一个字符
?:匹配零个或一个前一个字符
( ):字符组
2、使用布尔表达式,表达式的值为真时执行相应的操作
表达式中可以使用变量(如字段变量$1,$2等)和/rexp/
表达式中的运算符有
关系运算符: < > <= >= == !=
匹配运算符 ~ !~
x ~ /rexp/ 如果 x匹配/rexp/ ,则返回真
例如:awk '$1 > 20 {print $0}' test.in
awk '$2 ~ /^6/ {print $0}' test.in
3、复合表达式:&&、||、! 表达式中有比较运算符,一般用圆括号。
例如:
awk '($1<20)&&($2 ~ /^6/){print $0}' test.in
awk '($1<20)||($2 ~ /^6/){print $0}' test.in
awk '!($2 ~ /^6/){print $0}' test.in
awk '/^#/ && /#$/ {print }' test.in :打印以#号开头,并且以#号结尾的行
四、字段分隔符、重定向和管道
字段分隔符:
awk中的字段分隔符可以用 -F选项指定,缺省是空格(实际由全局变量IFS决定)
例如:awk '{print $1}' test.in
awk -F: '{print $1}' test.in
awk -F '[ :]' '{print $1}' test.in :可以是空格、也可以是冒号来分隔
五、重定向与管道:
例如: awk '{print $1, $2 > "output" }' test.in :第一列、第二列重定向到output文件
awk 'BEGIN { "cal" | getline a; print a}' : cal命令将日历显示出来,双引号不能省。获取cal输出的第一行到变量a中,打印输出
shell编程之awk的更多相关文章
- shell编程之awk命令详解
shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...
- 03 shell编程之case语句与函数
本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...
- shell编程之case分支语句
shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...
- shell编程之if语句
shell编程之if判断 目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other 1.整数比较 -eq 等于,如:if [ "$ ...
- shell编程之sed编辑器&gawk程序
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/560372 s ...
- shell编程之grep命令的使用
大家在学习正则表达式之前,首先要明确一点,并把它牢牢记在心里,那就是: 在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,不要把二者搞混了.切记!!! 通常有三种文本处理工具/ ...
- Shell编程之Shift的用法
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...
- shell 编程之 for while until 循环
shell 的for循环 的格式如下: for 变量 in 列表 do ... done 列表是一组值的序列 每个值通过空格隔开 每循环一次,列表中的下一个值赋给变量 in 列表是可选的,如果不用他 ...
- shell 编程之 if...else case...esac
shell的条件判断语句有三种 if...fi 语句 if...else...fi 语句 if...elif...fi 语句 例子: a=10; b=20; if [ $a -gt %b ] t ...
随机推荐
- 手把手教你AspNetCore WebApi:Nginx(负载均衡)
前言 这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,缓存等都用上了,还是不能解决问题.马老板很大气,又买了3台服务器,让小明做个集群分流一下. 集群是什么? 是一种计算机系统,它通过一 ...
- javascript in IE
前提:一个页面导入若干个js文件 问题: 1.如果其中一个文件出问题可能会导致下面的文件导入失败,如果导入很多外部js库文件,导致错误不好排查,可以调整好js的加载顺序,以免影响页面功能 2.IE获取 ...
- 物联网wifi模块
物联网wifi模块 物联网wifi模块 是上海卓岚推出的MQTT+JSON转Modbus物联网WiFi核心模块.支持以MQTT的方式连接云端服务器,支持可以界面话配置,自主采集Modbus仪表/645 ...
- day43 Pyhton 并发编程06
一.内容回顾 线程 锁 为什么有了GIL之后还需要锁 多个线程同时操作全局变量还需要锁 当出现'非原子性操作',例如+= -= *= /= l.append(l) 原子性操作 a += 1 a= a ...
- centos6.8 Mysql-5.7.20 升级 mysql-8.0.14-1
Mysql-5.7.20 升级 mysql-8.0.14-1 操作前建议先查阅以下网页初步了解Mysql版本升级信息 https://blog.csdn.net/u012946310/artic ...
- count=count++
count=count++ 的最终值是count =count,没加上1,该是啥是啥 count++ 的最终值是加一的值 注意: count = count ++ + 1 最终还是1
- 什么是SOAP?SOAP有什么用?什么时候会用到SOAP?
什么是SOAP SOAP(Simple Object Access Protocol)一般指简单对象访问协议,简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语 ...
- 走在深夜的小码农 Seventh Day
Css3 Seventh Day writer:late at night codepeasant 学习大纲: 1. 定位(position) 介绍 1.1 为什么使用定位 我们先来看一个效果,同时思 ...
- LuoguP4704 太极剑
题面 测试要求 Bob 尽可能快地切断 n 根绳子. 所有绳子的端点两两不同,所以共有 2n 个端点.这些端点被捆在一个圆上,等距离分布.我们把这些端点按顺时针方向编号为 1 到 2n. Bob 每次 ...
- SQL Server 列存储索引 第四篇:实时运营数据分析
实时运营数据分析(real-time operational analytics )是指同时在同一张数据表上执行分析处理和业务处理.分析查询主要是对海量数据执行聚合查询,而事务主要是指对数据表进行少量 ...