awk详解
awk的基本使用方法

awk的基本使⽤⽅法awk是处理⽂本⽂件的⼀个应⽤程序,⼏乎所有系统都⾃带这个程序。
它依次处理⽂件的每⼀⾏,并读取⾥⾯的每⼀个字段。
对于⽇志、CSV 那样的每⾏格式相同的⽂本⽂件,awk可能是最⽅便的⼯具。
awk其实不仅仅是⼯具软件,还是⼀种编程语⾔。
不过,本⽂只介绍它的命令⾏⽤法,对于⼤多数场合,应该⾜够⽤了。
⼀、基本⽤法awk的基本⽤法就是下⾯的形式。
# 格式$ awk 动作⽂件名# ⽰例$ awk '{print $0}' demo.txt上⾯⽰例中,demo.txt是awk所要处理的⽂本⽂件。
前⾯单引号内部有⼀个⼤括号,⾥⾯就是每⼀⾏的处理动作print $0。
其中,print是打印命令,$0代表当前⾏,因此上⾯命令的执⾏结果,就是把每⼀⾏原样打印出来。
下⾯,我们先⽤标准输⼊(stdin)演⽰上⾯这个例⼦。
$ echo 'this is a test' | awk '{print $0}'this is a test上⾯代码中,print $0就是把标准输⼊this is a test,重新打印了⼀遍。
awk会根据空格和制表符,将每⼀⾏分成若⼲字段,依次⽤$1、$2、$3代表第⼀个字段、第⼆个字段、第三个字段等等。
>$ echo 'this is a test' | awk '{print $3}'a上⾯代码中,$3代表this is a test的第三个字段a。
下⾯,为了便于举例,我们把/etc/passwd⽂件保存成demo.txt。
>root:x:0:0:root:/root:/usr/bin/zshdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/sync这个⽂件的字段分隔符是冒号(:),所以要⽤-F参数指定分隔符为冒号。
awk正则表达式和内置函数的使用方法实例详解

awk正则表达式和内置函数的使⽤⽅法实例详解awk正则表达式及内置函数实例详解:1、模糊匹配:复制代码代码如下:awk ‘{if($3~/97/) print $0}' data.f:如果第三项中含有”97”则打印该⾏awk ‘{if($4!~/ufcx/) print $0}' data.f:如果第三项中不含ufcx有则打印2、精确匹配:复制代码代码如下:awk ‘{if($5==66) print $0}' data.f:如果第五项是66则打印awk ‘{if($5!=66)print $0}' data.f : 如果第五项不是66则打印awk ‘{if($1>$5) print $0}' data.f:如果第⼀项⼤于第五项则打印3、⼤⼩写匹配:复制代码代码如下:awk ‘{if(/[Ss]ept/) print $0}' data.f:符合,则打印⼀⾏。
awk ‘/[Ss]ept/ {print $2}' data.f:符合,则打印第⼆字段4、任意匹配:复制代码代码如下:awk ‘{if($2 ~/^.e/) print $0}' data.f:第⼆字段中,第⼆个字符为e,输出awk ‘{if($4 ~/(lps|fcx)/) print $0}' data.f:第四个字段含有lps或fcx则输出5、&&,||:复制代码代码如下:awk ‘{if($3 ~/1993/ && $2==”sept”) print $0}' data.f:两边都真则输出awk ‘{if($3 ~/a9/ || $2==”sept”) print $0}' data.f:⼀边为真则输出6、变量定义:awk ‘{date=$2;price=$5; if(date ~/[Ss]ept/) print “price is ” price}' data.f:变量定义,满⾜date是sept或者Sept的将price输出。
Linux三剑客awk、grep、sed详解

Linux三剑客awk、grep、sed详解⼀、前⾔linux 有很多⼯具可以做⽂本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, head, tail.....,学习 linux ⽂本处理的懒惰⽅式(不是最好的⽅法)可能是:只学习grep,sed和awk。
使⽤这三个⼯具,你可以解决近 99% linux 系统的⽂本处理问题,⽽不需要记住上⾯不同的命令和参数。
:)⽽且,如果你已经学会并使⽤了三者,你就会知道其中的差异。
实际上,这⾥的差异意味着哪个⼯具擅长解决什么样的问题。
⼀种更懒惰的⽅式可能是学习脚本语⾔(python,perl或ruby)并使⽤它进⾏每个⽂本处理。
⼆、概述awk、grep、sed 是 linux 操作⽂本的三⼤利器,也是必须掌握的 linux 命令之⼀。
三者的功能都是处理⽂本,但侧重点各不相同,其中属awk 功能最强⼤,但也最复杂。
grep 更适合单纯地查找或匹配⽂本,sed 更适合编辑匹配到的⽂本,awk 更适合格式化⽂本,对⽂本进⾏较复杂格式处理。
简单概括:grep:数据查找定位awk:数据切⽚sed:数据修改三、grep = global regular expression print⽤最简单术语来说,grep(全局正则表达式打印)--命令⽤于查找⽂件⾥符合条件的字符串。
从⽂件的第⼀⾏开始,grep 将⼀⾏复制到 buffer 中,将其与搜索字符串进⾏⽐较,如果⽐较通过,则将该⾏打印到屏幕上。
grep将重复这个过程,直到⽂件搜索所有⾏。
注意这⾥没有进程执⾏ grep 存储⾏、更改⾏或仅搜索部分⾏。
1、⽰例数据⽂件请将以下数据剪切粘贴到⼀个名为 “sampler.log” 的⽂件中:bootbookboozemachinebootsbungiebarkaardvarkbroken$tuffrobots2、⼀个简单例⼦grep 最简单的例⼦是:grep "boo" sampler.log在本例中,grep 将遍历⽂件 “sampler.log” 的每⼀⾏,并打印出其中的每⼀⾏包含单词“boo”:bootbookboozeboots但是如果你操作的是⼤型⽂件,就会出现这种情况:如果这些⾏标识了⽂件中的哪⼀⾏,它们是什么,可能对你更有⽤,如果需要在编辑器中打开⽂件,那么可以更容易地跟踪特定字符串做⼀些改变。
Linux三剑客详解(grep、sed、awk)

Linux三剑客详解(grep、sed、awk)前⾔ 在Linux的学习和使⽤当中,⼈们常常提到的三剑客其实指的是grep、sed、awk这三个命令的简称,当熟练掌握了这⼏个命令,可以极⼤的提升运维效率。
在讲到这三个命令之前,我们得先了解什么是正则表达式,正则表达式是学习三剑客的基础和前提。
⼀、正则表达式 正则表达式:Regular Expression,描述了⼀种字符串匹配的模式(pattern),可以⽤来检查⼀个串是否含有某种⼦串、将匹配的⼦串替换或者从某个串中取出复核某个条件的⼦串等。
标准正则表达式:元字符:. 匹配任意单个字符[] 匹配指定范围内的任意单个字符[^] 匹配指定范围外的任意单个字符字符集合:[:alnum:] 代表英⽂⼤⼩写字符及数字,亦即 0~9、A~Z、a~z[:alpha:] 代表任何英⽂⼤⼩写字符,亦即 A~Z、a~z[:blank:] 代表空格键与[tab]按键两者[:cntrl:] 代表键盘上⾯的控制按键,包括CR、LF、Tab、Del等[:digit:] 代表数字⽽已,即 0~9[:graph:] 除了空格符(空格键与[tab]按键)外的其他所有按键[:lower:] 代表⼩写字符,即 a~z[:print:] 代表任何可以被打印出来的字符[:punct:] 代表标点符号(punctuation symbol),亦即 : " ' ? ! ; : # $[:upper:] 代表⼤写字符,即 A~Z[:space:] 代表会产⽣空⽩的字符,包括空格键、[tab]、CR等[:xdigit:] 代表⼗六进制的数字类型,因此包括 0~9、A~F、a~f 的数字与字符匹配次数(贪婪模式):* 匹配其前⾯的字符任意次?匹配其前⾯的字符0次或者1次+ 匹配其前⾯的字符⾄少1次.* 任意长度的任意字符位置锚定:^ 锚定⾏⾸,此字符后⾯的任意内容必须出现在⾏⾸$ 锚定⾏尾,此字符后⾯的任意内容必须出现在⾏尾^$ 空⽩⾏因为在Linux系统中shell解释器的特殊处理,某些元字符在linux下具有展开式等特殊含义,在实际使⽤过程中,我们需要添加 / 对其进⾏转义。
awk命令详解(转整理)

awk命令详解(转整理)awk命令详解(转整理)⼀、前⾔awk有3个不同版本: awk、nawk和gawk,未作特别说明,⼀般指gawk。
awk语⾔的最基本功能是在⽂件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。
完整的awk脚本通常⽤来格式化⽂本⽂件中的信息。
⼆、基本语法awk [opion] 'awk_script' input_file1 [input_file2 ...]awk的常⽤选项option有:① -F fs : 使⽤fs作为输⼊记录的字段分隔符,如果省略该选项,awk使⽤环境变量IFS的值② -f filename : 从⽂件filename中读取awk_script③ -v var=value : 为awk_script设置变量awk有三种运⾏⽅式:第⼀种,把awk的脚本命令直接放在命令中。
第⼆种,把awk的所有的脚本命令放在⼀个脚本⽂件中,然后⽤-f选项来指定要运⾏的脚本命令⽂件。
第三种,将awk_script放⼊脚本⽂件并以 #!/bin/awk -f 作为⾸⾏,给予该脚本可执⾏权限,然后在shell下通过键⼊该脚本的脚本名调⽤之。
三、awk脚本awk脚本可以由⼀条或多条awk_cmd组成,对于多个awk_cmd,⼀个awk_cmd完成后,应该另起⼀⾏,以便进⾏隔。
awk_cmd由两部分组成: awk_pattern { actions }。
另外,在awk命令中直接使⽤awk_script时,awk_script也可以被分成多⾏书写,但必须确保整个awk_script被单引号括起来。
awk命令的⼀般形式:awk ' BEGIN { actions }awk_pattern1 { actions }............awk_patternN { actions }END { actions }' inputfile其中 BEGIN { actions } 和 END { actions } 是可选的。
awk用法技巧

这样可以清楚的看出,awk是一行一行读取文本,然后按照代码的前后顺序执行。但如果action中 包含next或exit时,有所不同: awk ‘$1==3{printf “|| “$0;next}{printf “@@ “$0}{print $0}’ file @@ 11 @@ 22 || 3@@ 44 @@ 55
awk ‘$1==3{printf “|| “$0;exit}@@ 11 @@ 22 || 3
awk ‘{print “NR = ” NR ” FNR = ” FNR, $0}’ file file NR = 1 FNR = 1 a NR = 2 FNR = 2 b NR = 3 FNR = 3 c NR = 4 FNR = 4 d NR = 5 FNR = 5 e
NR = 6 FNR = 6 f NR = 7 FNR = 1 a NR = 8 FNR = 2 b NR = 9 FNR = 3 c NR = 10 FNR = 4 d NR = 11 FNR = 5 e NR = 12 FNR = 6 f
4. 为什么OFS不起作用? 先看一个例子: echo ‘aaa bbb ccc ddd aaa bbb ccc ddd aaa bbb ccc ddd aaa bbb ccc ddd’ |awk -v OFS=”|” ‘{print $0}’ aaa bbb ccc ddd aaa bbb ccc ddd aaa bbb ccc ddd aaa bbb ccc ddd 上面的例子中OFS为什么没有生效呢,原因是OFS指的是输出字段分隔符,所以必须对字段进行操 作时OFS才会起作用,正确的方法应该是: echo ‘aaa bbb ccc ddd aaa bbb ccc ddd aaa bbb ccc ddd aaa bbb ccc ddd’ |awk -v OFS=”|” ‘{$1=$1;print $0}’ aaa|bbb|ccc|ddd aaa|bbb|ccc|ddd aaa|bbb|ccc|ddd aaa|bbb|ccc|ddd
awk详解

Malist
dj121M112d12nmm
tete
4. 实例说明:
awk '/^/' list.txt 匹配包含^的行,即显示全文
awk '/$/' list.txt 匹配包含$的行,即显示全文
sub(r,s) 将$ 0第一个r替换为s ,r可为/正则/
sub(r,s,t) 将域t中的第一个r替换为s ,r可为/正则/
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
awk '{n++}END{print n" line"}' list.txt 统计文本内容行数
awk -F: '{if($2~/15026736523/) print $0}' list.txt 匹配第二域,并显示该记录
awk '$0!~/15026736523/' list.txt 不匹配并显示该记录
&& 等同 AND 语句两边必须同时匹配为真
|| 等同 OR 语句两边同时或其中一边匹配为真。
! 求逆
ARGC 支持命令行中传入awk脚本的参数个数。
ARGVARGC 参数排列数组,其中每一元素表示为ARGV[n],n为期望访问的命令行参数。
awk '{if ($1<QQ) print $0}' QQ=360565687 list.txt 传递参数给awk使用
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
Mac命令行实战使用AWK进行数据处理与分析

Mac命令行实战使用AWK进行数据处理与分析AWK是Unix及Unix-like操作系统上非常强大的文本处理工具,能够帮助我们对大量的数据进行处理和分析。
在Mac系统上,我们可以通过命令行来使用AWK来处理数据,实现各种功能,比如数据过滤、数据转换、数据统计等等。
本文将介绍AWK的基本使用方法,并通过实际案例来展示如何使用AWK进行数据处理与分析。
一、AWK简介AWK是一种处理文本文件的工具,它可以对文件进行数据提取、转换和报告。
AWK的名字来自其创始人的姓氏:Aho、Weinberger和Kernighan。
AWK可以根据预设的规则来处理文本,这些规则由用户指定。
它提供了丰富的内置函数和特定的语法结构,可以进行文本匹配、条件判断、循环操作等等。
因此,AWK成为了处理结构化文本数据的强大工具。
二、AWK的基本语法在Mac命令行中使用AWK时,需要按照以下的基本语法结构来编写AWK程序:```awk 'pattern { actions }' file```其中,pattern用于匹配输入数据,可以是正则表达式,也可以是其他条件;actions则是在满足pattern的情况下执行的动作;file则是输入的文件名。
AWK程序会逐行读取文件的每一行数据,并根据pattern进行匹配。
如果匹配成功,则执行相应的actions。
可以为同一个pattern指定多个actions,用逗号分隔。
三、AWK的常用功能AWK提供了丰富的功能,下面列举了一些常用的功能及其对应的AWK命令:1. 数据提取AWK可以按照指定的字段提取数据。
默认情况下,AWK以空格作为字段分隔符,第一个字段为$1,第二个字段为$2,依此类推。
可以通过使用-F参数指定其他的字段分隔符。
```awk '{ print $1,$2 }' file```2. 数据过滤AWK可以根据条件进行数据过滤。
可以使用关系运算符(比如>、<、==)、逻辑运算符(比如&&、||)以及正则表达式等来定义过滤条件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.打印结尾
–
awk -F: '{print $1} END {print "this is all users"}' /etc/passwd
条件操作符
1.匹配
–
awk -F: ‘{if($1~/root/) print }’ /etc/passwd 示如果field1包含root,打印它
内置的字符窜函数
gsub(r,s) gsub(r,s,t)
整个$0中用s替代r 在整个t中用s替代r
index(s,t)
length(s) match(s,r) split(s,a,fs) sub(s,
返回s中字符串t的第一位置
返回s长度
测试s中是否包含匹配r的字符串
在fs上将s分成序列a 用$0中最左边也是最长的字符串替代 返回字符串s中从p开始的后缀部分 返回字符串s中从p开始长度为n的后缀部
4.小于
< <=
5.小于等于
6.大于
>
7.设置大小写
–
awk '/[Rr]oot/' /etc/passwd
8.任意字符
–
awk -F: '{if($1~/^...t/) print}' /etc/passwd
//^...t表示第四个字幕是t
9.或关系匹配
– –
awk -F: '{if ($1~/(squid|nagios)/) print}' /etc/passwd awk -F: '{if($1~"root|bin"){print}}' /etc/passwd
打印有多少行记录
–
awk 'END {print NR}' /etc/passwd
设置输入域到变量名
–
awk -F: '{name=$1; path=$7; if(name~/root/) print name "\tpath is:" path}' /etc/passwd
域值比较操作
//{if($1~/root/) print}表
2.精确匹配
–
(使用等号 ==)
awk -F: '{if($3=="0") print }' /etc/passwd
3.不匹配(
– – –
!~ )
awk -F: '{if($1!~/linuxtone/) print }' /etc/passwd 精确不匹配( !=) awk -F: '{if($1!="linuxtone") print }' /etc/passwd
内置变量
ARCC ARGV
命令行参数个数 命令行参数排列
ENVIRON
FNR FS NF NR OFS ORS
支持队列中系统环境变量的使用
浏览文件的记录数
置顶分隔符,等价于-F
浏览记录的域的个数 已读的记录数 输出域分隔符 输出记录分隔符
RS
控制记录分隔符
awk中的正则表达式
数据副本,awk不会修改输入文件的内容。
awk的总是输出到标准输出,如果想让awk输出到文件,可
以使用重定向。
awk'BEGIN
{print "name level result1\n----------"} {print $1,$2,$3} END {print "end of class1 results."}' result
)
subtr(s,p) substr(s,p,n)
分
1.gsub
–
–
– –
awk 'gsub(/^root/,"netseek") {print}' /etc/passwd 头的root替换为netseek awk 'gsub(/0/,2) {print}' /etc/fstab awk '{print gsub(/0/,2) $0}' /etc/fstab awk -F: 'gsub("root","xin"){print}' /etc/passwd
awk中的正则表达式两个//之间由字符组成 ^匹配行首$匹配行尾.匹配任意一个字符
+匹配1个或多个前一字符
?匹配0个或1个前一字符 *匹配0个或多个前一字符 []字符组[^]不在字符组的 ()组合|或&用于替代串中,代表查找串中匹配到的内容
在正则表达式中将字符串组合在一起。 命令行:awk‘/a(ll)?(nn)?e/’
2.保存输出
– –
–
4.打印所有记录
–
awk -F: '{print $0}' /etc/passwd
5.打印单独记录
–
awk -F: '{print $1,$4}' /etc/passwd
6.打印报告头
–
awk -F: 'BEGIN {print "NAME\n"} {print $1}' /etc/passwd
AWK
蔡元纪
调用awk
第一种方式:命令行方式
– –
awk [-F field-separator] 'commands' input-file(s) [-F域分隔符]是可选的,因为awk使用空格作为缺省的域分隔符,因 此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览 诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选 项,如:awk -F: 'commands' input-file
第二种方式是将所有awk命令插入一个文件,并使awk程序
可执行,然后用awk命令解释器作为脚本的首行,以便通 过键入脚本名称来调用它。 调用:
– –
第三种方式是将所有的awk命令插入一个单独文件,然后
awk -f awk-scrīpt-file input-files(s) -f选项指明在文件awk_scrīpt_file中的awk脚本,input_file(s)是使用 awk进行浏览的文件名。
10.行首
–
awk '/^root/' /etc/passwd
// ^root(行首包含root)
11.AND
–
&&
awk -F: '{if($1=="root" && $3=="0") print}' /etc/passwd
12.OR
–
||
awk -F: '$1~"root" || $3==11' /etc/passwd
– – – –
' [BEGIN { actions }]
awk_pattern1 { actions } ............ awk_patternN { actions } [END { actions }]' inputfile
其中
BEGIN { actions } 和 END { actions } 是可选的。 区块存在,awk执行它指定的actions。
testfile将具有字符串ae或alle或 anne或allnne的所有记录打印至标准输出。 12 | awk '{sub(/(1)(2)/,"a&b",$1);print}'
–
echo
a12b
echo
–
12 | awk '{sub(/(1)/,"a&b",$1);print}'
a1b2
POSIX字符类 [:alnum:]文字数字[:alpha:]文字
–
awk '{if($6<$7) print $0}' input-file
修改文本域只显示修改改记录
–
awk -F: '{if($1=="nagios") {$1="nagios server" ; print }}' /etc/passwd
文件长度相加
–
ls -l|awk '/^[^d]/ {print $9"\t" $5} {tot+=$5} END {print "total kb:"tot}'
[:digit:]数字[:graph:]非空字符(非空格控制字符)
[:lower:]小写字符[:upper:]大写字符 [:cntrl:]控制字符[:print:]非空字符(包括空格) [:punct:]标点符号[:blank:]空格和TAB字符 [:xdigit:]16进制数字[:space:]所有空白字符(新行、空格、
如果BEGIN
awk从输入文件中读取一行,称为一条输入记录。(如果输
入文件省略,将从标准输入读取)
运行过程
awk将读入的记录分割成字段,将第1个字段放入变量$1中,
第2个字段放入$2,以此类推。$0表示整条记录。字段分隔 符使用shell环境变量IFS或由参数指定。
把当前输入记录依次与每一个awk_cmd中awk_pattern比较,
域和记录
使用$1,$3表示参照第1和第3域,注意这里用逗号做域分隔。
如果希望打印一个有5个域的记录的所有域,可使用$0, 意即所有域。