window awk命令用法
- 格式:docx
- 大小:36.51 KB
- 文档页数:2
awkk命令用法
awk是一个强大的文本处理工具,它使用一种特定的语法,可以用来进行模式扫描和文本/数据提取。
awk的基本语法如下:
```
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
```
首先,执行关键字BEGIN标识的{}中的命令。
完成BEGIN大括号中命令的后,开始执行body命令。
逐行读取数据,默认读到分割的内容为一条记录,其实就是行的概念。
将记录按照指定的分隔符划分为字段,其实就是列的概念。
循环执行body块中的命令,每读取一行,执行一次body,最终完成body执行。
最后,执行END命令,通常会在END中输出最后的结果。
awk是输入驱动的,有多少输入行,就会执行多少次body命令。
awk的强大之处在于它支持各种强大的文本处理功能,包括字符串操作、正则表达式匹配、数学运算等。
同时,awk还支持变量和数组,可以方便地进行数据处理和转换。
此外,awk还有许多内置函数和选项,可以用来扩展其功能和灵活性。
例如,可以通过-F选项指定字段分隔符,通过-f选项指定外部函数文件等。
总的来说,awk是一个非常强大的文本处理工具,它可以用来进行数据提取、转换、报告生成等任务。
如果你需要进行文本处理工作,awk绝对是一个值得学习和掌握的工具。
shell学习awk入门电脑资料
一. awk应用场景
格式化数据或从一个大的文本文件中抽取记录
二. 使用方法
命令行方式
$awk [-F field-separator] ‘mands’ input-file(s)
mands是真正的awk命令
[-F域分割符]是可选的,如果无-F选项,awk默认用空格作为分隔符,如果域分隔符不为空格,比方要浏览以”:”作为分隔符的password文件那么必须指明-F选项,如:
awk -F: ‘mands’ input-file
awk脚本文件
将1中的命令行写入一个文件,用bash或sh去解释它,执行命令为shawkscriptfile或 ./awkscriptfile, 后者需要给脚本文件加执行权限,
将所有awk命令写入一个文件awkscriptfile,用$awk -f awkscriptfile input-file(s),例如,
三. awk脚本组成
awk语句都是由模式和动作组成。
域即用分隔符分割的字段,用$1,$2,$3...,$n表示第一个、第二个、第三个,第n个字段, $0表示所有字段。
或
变量提高了awk程序可读性,下面是变量使用的简单例子
本文只是简单的介绍了awk的根本语法,阅读本文后可以用awk完成简单的文本处理功能,awk博大精深,如果要深入学习建议阅读更专业的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 } 是可选的。
简介搜索支持正则,例如找root开头的: awk -F: '/^root/' /etc/passwd搜索/etc/passwd有root关键字的所有行,并显示对应的shell# awk -F: '/root/{print $7}' /etc/passwd/bin/bash这里指定了action{print $7}awk内置变量awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行 -F选项NF 浏览记录的域的个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符此外,$0变量是指整条记录。
$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:#awk -F ':''{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwdfilename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/b in/bashfilename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr /sbin:/bin/shfilename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/ shfilename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/ sh使用printf替代print,可以让代码更加简洁,易读awk -F ':''{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwdprint和printfawk中同时提供了print和printf两种打印输出的函数。
df -h和awk的用法
df命令用于显示磁盘空间利用情况,而-h参数则会以人类可读
的方式显示结果,即将字节转换为更大的单位(如KB、MB、GB等)。
因此,执行df -h命令会列出系统中所有挂载的文件系统以及它们
的磁盘空间利用情况。
而awk是一种用于文本处理和分析的强大工具,它可以根据指
定的规则从文本文件中提取数据并对数据进行处理。
在结合df命令
使用时,可以使用awk来进一步处理df命令的输出,以便提取特定
的信息或进行格式化输出。
举例来说,如果我们想要列出文件系统的名称和利用率,我们
可以使用以下命令:
df -h | awk '{print $1, $5}'。
这条命令中,df -h用于显示文件系统的磁盘空间利用情况,
并将结果通过管道传递给awk命令。
在awk命令中,'{print $1, $5}'指定了打印输出的格式,$1表示第一个字段(文件系统的名称),$5表示第五个字段(磁盘利用率)。
这样,我们就可以得到
文件系统名称和对应的利用率信息。
另外,awk还可以进行更复杂的文本处理,比如进行条件判断、循环处理等。
它的灵活性使得它在处理文本数据时非常实用。
综上所述,df -h命令用于显示磁盘空间利用情况,而awk命
令可以对df命令的输出进行进一步处理,提取所需信息或进行格式
化输出,是一种非常实用的文本处理工具。
awk的用法(p263-269)awk使用空格作为缺省的域分隔符。
-F使用指定的分隔符分隔指定域awk执行时,其浏览域标记为$1,$2…$n,这种方法称为域标识。
如果希望打印一个5个域的记录的所有域,不必指明$1,$2,$3,$4,$5,可使用$0,意即所有域。
现有一个文本文件grade.txtM.Tansley 05/09 48311 Green 8 40 44J.Lulu 06/99 48317 green 9 24 26P.Bunny 02/99 48 Yellow 12 35 28J.Troll 07/99 4842 Brown-3 12 26 26L.Tansley 05/99 4712 Brown-2 12 30 28保存awk输出:1.使用输出重定向符号 > 文件名awk‘{ print $0 }’grade.txt > one2.使用tee命令,在输出到文件的同时输出到屏幕。
awk‘{ print $0 }’grade.txt |tee one打印整个文件:awk‘{ print $0 }’grade.txt打印单独记录:awk‘{ print $1,$4 }’grade.txt为输出文本加入信息头:awk‘BEGIN { print “字符 \t字符 \n---------” } { print $1“\t”$4 }’grade.txt\n:换行\t:Tab为输出文本加入信息尾:awk‘END { print “The-end” } { print $1 }’grade.txt只适用于awk而不适用于grep和sed的两个字符:+使用+匹配一个或多个字符?匹配模式出现频率awk条件操作符:<小于>大于<=小于等于>=大于等于=把后面的值赋予前面的变量==等于!=不等于~匹配正则表达式~!不匹配正则表达式符号~后紧跟正则表达式,awk中if后面的条件用()括起来。
awk命令使⽤⽅法1、基本语法awk '{pattern + action}' {filenames}awk语法中pattern表⽰在数据中查找的内容,⽽action是在找到匹配内容时所执⾏的⼀系列命令。
花括号({})不需要在程序中始终出现,但它们⽤于根据特定的模式对⼀系列指令进⾏分组。
pattern就是要表⽰的正则表达式,⽤斜杠括起来。
2、awk原理awk 对输⼊⽂件中的每⼀⾏都执⾏这个脚本:$ awk -F":" '{ print $1 }' /etc/passwd$ awk -F":" '{ print $1 $3 }' /etc/passwd$ awk -F":" '{ print $1 " " $3 }' /etc/passwd$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd-F参数:指定分隔符,可指定⼀个或多个print 后⾯做字符串的拼接NF:⼀条记录中⽤分割符分隔开来的字段数⽬NR:已经读出的记录数,就是⾏号,从1开始实例⼀:只查看test.txt⽂件(100⾏)内第20到第30⾏的内容[root@local]# awk '{if(NR>=5 && NR<=10) print $1}' test.txt5678910实例⼆:已知test.txt⽂件内容为[root@local]# cat test.txtI am Poe,my qq is 168请从该⽂件中过滤出'Poe'字符串与168,最后输出的结果为:Poe 168[root@local]# awk -F '[ ,]+' '{print $3" "$7}' test.txtPoe 1683、BEGIN和END模块通常,对于每个输⼊⾏,awk 都会执⾏每个脚本代码块⼀次。
本文命令已在AIX系统中验证。
AWK-扫描文件中每一行逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕)输出使用{print }1,输出某一列,print $列号awk ‘{print $1}’文件名输出文件中每一行的第一列awk ‘{print $1 $3}’文件名输出文件中每一行的第一列和第三列{print $0}与{print}不做限制,输出所有2,对行内容转换,print 字符awk '{print “A”}’文件名将每一行内容使用A进行替换awk '{print 5}' 文件名将每一行内容使用5进行替换数字不需引号,其余字符需要引号。
指定不同的分隔符,如分隔符不为空格使用-F指定awk -F”:”‘{print $1 $3}’文件名使用冒号作为新的分隔符。
awk -F'[:\t]' '{print $1,$3}' 文件名使用冒号或空格作为分割符,其中\t 表示TAB键,\n表示换行、回车。
如需在输出时修改每一列信息如修改为第一列XX 第二列XX 第三列XXawk -F":" '{print "1st:" $1 "\t2nd:" $2 "\t3rd:"$3}' 文件名表示在第一列前加上1st:第二列前加上2nd: 第三列前加上3st:原文件内容A:a:1B:b:2C:c:3D:d:4E:e:5F:f:6输出如下:1st:A 2nd:a 3rd:11st:B 2nd:b 3rd:21st:C 2nd:c 3rd:31st:D 2nd:d 3rd:41st:E 2nd:e 3rd:51st:F 2nd:f 3rd:6使用\n效果如下:awk -F":" '{print "1st:" $1 "\n2nd:" $2 "\n3rd:"$3}' awk11st:A2nd:a3rd:11st:B2nd:b3rd:21st:C2nd:c3rd:31st:D2nd:d3rd:41st:E2nd:e3rd:51st:F2nd:f3rd:6awk '/^(AA|BB)/' awk1输出以A或B开始的行,^表示行开头,A和B可以使用词组,如AA|BB|CC,表示AA、BB、CC开头的行均被输出。
awk⽤法(使⽤⼊门)awk ⽤法:awk ' pattern {action} '变量名含义ARGC 命令⾏变元个数ARGV 命令⾏变元数组FILENAME 当前输⼊⽂件名FNR 当前⽂件中的记录号FS 输⼊域分隔符,默认为⼀个空格RS 输⼊记录分隔符NF 当前记录⾥域个数NR 到⽬前为⽌记录数OFS 输出域分隔符ORS 输出记录分隔符1、awk '/101/' file 显⽰⽂件file中包含101的匹配⾏。
awk '/101/,/105/' fileawk '$1 == 5' fileawk '$1 == "CT"' file 注意必须带双引号awk '$1 * $2 >100 ' fileawk '$2 >5 && $2<=15' file2、awk '{print NR,NF,$1,$NF,}' file 显⽰⽂件file的当前记录号、域数和每⼀⾏的第⼀个和最后⼀个域。
awk '/101/ {print $1,$2 + 10}' file 显⽰⽂件file的匹配⾏的第⼀、⼆个域加10。
awk '/101/ {print $1$2}' fileawk '/101/ {print $1 $2}' file 显⽰⽂件file的匹配⾏的第⼀、⼆个域,但显⽰时域中间没有分隔符。
3、df | awk '$4>1000000 ' 通过管道符获得输⼊,如:显⽰第4个域满⾜条件的⾏。
4、awk -F "|" '{print $1}' file 按照新的分隔符“|”进⾏操作。
awk 'BEGIN { FS="[: \t|]" }{print $1,$2,$3}' file 通过设置输⼊分隔符(FS="[: \t|]")修改输⼊分隔符。
快速掌握AWK的基本使用方式
本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行了删减或者补充,希望能为对AWK感兴趣的小伙伴提供一份快速入门的教程,帮助小伙伴们快速掌握AWK的基本使用方式,当然,我也是刚开始学习AWK,本文在翻译或者补充的过程中肯定会有很多疏漏或者错误,希望大家能够帮忙指正。
本文将会持续修正和更新,最新内容请参考我的GITHUB 上的程序猿成长计划项目,欢迎Star。
概述
AWK是一门解释型的编程语言。
在文本处理领域它是非常强大的,它的名字来源于它的三位作者的姓氏:Alfred Aho,Peter Weinberger 和Brian Kernighan。
GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为GNU AWK。
AWK的类型
下面是几个AWK的变体:
AWK –原先来源于AT ">NAWK –AT ">GAWK –这就是GNU AWK。
所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容
AWK的典型用途
使用AWK可以做很多任务,下面是其中一些
文本处理
输出格式化的文本报表
执行算数运算
执行字符串操作等等
工作流
要成为AWK编程专家,你需要先知道它的内部实现机制,AWK遵循了非常简单的工作。
awk语法规则
awk语法规则是一种文本处理工具,它可用于在文件中查找和替换数据。
以下是几个基本的awk语法规则:
1. awk命令的基本语法为:
```
awk [选项] '模式1 {动作1} 模式2 {动作2} ...' 文件名
```
其中,选项可以是:
-F:指定输入文件的字段分隔符
-v:定义变量
-f:指定包含awk脚本的文件名
2. awk的模式指定了对应的动作。
模式可以是以下几种:
- /正则表达式/:匹配正则表达式的行
- BEGIN:在处理输入之前执行的动作
- END:在处理输入之后执行的动作
- 行号:匹配行号的行
3. awk的动作指定了对应模式下要执行的命令。
动作可以是以下几种:
- print:输出指定的字段或整行
- printf:格式化输出
- getline:读入下一行数据
- if-else语句:条件语句
4. awk中的变量:
- $0:整行数据
- $1, $2, ...:第1、2、...个字段
- NR:当前记录的行号
- NF:当前记录的字段数
5. awk中的运算符:
- +、-、*、/:加、减、乘、除
- %:取模
- ==:等于
- !=:不等于
- >、>=、<、<=:大于、大于等于、小于、小于等于以上是awk语法规则的基本内容,掌握这些规则可以方便地进行文本处理。
awk命令详解awk是⼀个强⼤的⽂本分析⼯具,相对于grep的查找,sed的编辑,awk在其对数据分析并⽣成报告时,显得尤为强⼤。
简单来说awk就是把⽂件逐⾏的读⼊,以空格为默认分隔符将每⾏切⽚,切开的部分再进⾏各种分析处理。
使⽤⽅法:awk '{pattern + action}' {filenames}尽管操作可能会很复杂,但语法总是这样,其中 pattern 表⽰ AWK 在数据中查找的内容,⽽ action 是在找到匹配内容时所执⾏的⼀系列命令。
花括号({})不需要在程序中始终出现,但它们⽤于根据特定的模式对⼀系列指令进⾏分组。
pattern就是要表⽰的正则表达式,⽤斜杠括起来。
awk语⾔的最基本功能是在⽂件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进⾏其他⽂本操作。
完整的awk脚本通常⽤来格式化⽂本⽂件中的信息。
通常,awk是以⽂件的⼀⾏为处理单位的。
awk每接收⽂件的⼀⾏,然后执⾏相应的命令,来处理⽂本。
awk程序的报告⽣成能⼒通经常使⽤来从⼤⽂本⽂件⾥提取数据元素并将它们格式化成可读的报告。
最完美的样例是格式化⽇志⽂件。
awk的⽤法awk'BEGIN{ commands } pattern{ commands } END{ commands }'第⼀步:运⾏BEGIN{ commands }语句块中的语句。
第⼆步:从⽂件或标准输⼊(stdin)读取⼀⾏。
然后运⾏pattern{ commands }语句块,它逐⾏扫描⽂件,从第⼀⾏到最后⼀⾏反复这个过程。
直到⽂件所有被读取完成。
第三步:当读⾄输⼊流末尾时。
运⾏END{ commands }语句块。
BEGIN语句块在awk開始从输⼊流中读取⾏之前被运⾏,这是⼀个可选的语句块,⽐⽅变量初始化、打印输出表格的表头等语句通常能够写在BEGIN语句块中。
END语句块在awk从输⼊流中读取全然部的⾏之后即被运⾏。
以下是一些基本的AWK用法:1.打印指定列:bashawk 'print $1,$3' file.txt这会打印文件file.txt中的第一列和第三列。
2.根据模式打印行:bashawk '/pattern/ {print $0}' file.txt这会打印包含字符串pattern的所有行。
3.条件语句:bashawk '$1 > 50 {print$1}' file.txt这会打印文件file.txt中第一列值大于50的所有行的第一列。
4.使用分隔符分割数据:bashawk -F ',' 'print $1,$3' file.csv这会使用逗号","作为分隔符来处理file.csv中的数据。
5.计算行数、列数、和:bashawk 'END {print NR " rows"}' file.txtawk 'print NF " columns"' file.txtawk '{sum+=$1} END {print "Sum ", sum}' file.txt分别打印文件file.txt的行数、列数以及所有第一列数值的和。
6.使用变量和循环:bashawk '{for(i=1; i<NF; i++) sum[i] += $i} END {for(i=1; i<NF; i++) print sum[i]}' file.txt 这会计算每个列的和,并将结果存储在数组sum中。
7.修改或替换数据:bashawk 'gsub("pattern", "replacement") {print $0}' file.txt这会替换文件file.txt中所有pattern字符串为replacement。
awk命令使⽤awk命令就是把⽂件逐⾏的读⼊,以空格为默认分隔符将每⾏切⽚,切开的部分再进⾏各种分析处理。
例如:awk -F '/''{print $NF}' tmp/file.txt该命令⽤于读取file.txt⽂件中的内容,读取到的每⾏内容按'/'分隔符分割后并打印最后⼀个词,如读取到lib/xxx.txt内容将会打印出xxx.txt awk命令语法:awk [-F|-f|-v] 'BEGIN{} //{command1; command2} END{}' file[-F|-f|-v] ⼤参数,-F指定分隔符,-f调⽤脚本,-v定义变量 var=value' ' 引⽤代码块BEGIN 初始化代码块,在对每⼀⾏进⾏处理之前,初始化代码,主要是引⽤全局变量,设置FS分隔符// 匹配代码块,可以是字符串或正则表达式{} 命令代码块,包含⼀条或多条命令;多条命令使⽤分号分隔END 结尾代码块,在对每⼀⾏进⾏处理之后再执⾏的代码块,主要是进⾏最终计算或输出结尾摘要信息1、print命令是awk打印指定内容的主要命令:⽰例:读取tmp⽬录下的file.txtawk'{print}' tmp/file.txt2、F指定分隔符读取awk -F '/''{print $1}' tmp/file.txt按分隔符分割后打印第⼀个词awk -F '/''{print $NF}' tmp/file.txt按分隔符分割后打印最后⼀个词awk -F '/''{print $(NF-1)}' tmp/file.txt按分隔符分割后打印倒数第⼆个词附注:$0 表⽰整个当前⾏$1 每⾏第⼀个字段NF 字段数量变量NR 每⾏的记录号,多⽂件记录递增FNR 与NR类似,不过多⽂件记录不递增,每个⽂件都从1开始\t 制表符\n 换⾏符FS BEGIN时定义分隔符RS 输⼊的记录分隔符,默认为换⾏符(即⽂本是按⼀⾏⼀⾏输⼊)~ 匹配,与==相⽐不是精确⽐较!~ 不匹配,不精确⽐较== 等于,必须全部相等,精确⽐较!= 不等于,精确⽐较&& 逻辑与|| 逻辑或+ 匹配时表⽰1个或1个以上/[0-9][0-9]+/ 两个或两个以上数字/[0-9][0-9]*/ ⼀个或⼀个以上数字FILENAME ⽂件名OFS 输出字段分隔符,默认也是空格,可以改为制表符等ORS 输出的记录分隔符,默认为换⾏符,即处理结果也是⼀⾏⼀⾏输出到屏幕-F'[:#/]' 定义三个分隔符。
awk命令⽤法 awk:把⽂件逐⾏的读⼊,以空格为默认分隔符将每⾏切⽚,切开的部分再进⾏各种分析处理,是⼀个强⼤的⽂本分析⼯具,在对数据分析并⽣成报告时很有优势。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,⼀般指gawk,gawk 是 AWK 的 GNU 版本。
命令格式:awk [options] 'program' FILE ...其中:options:-F:指明输⼊时⽤到的字段分隔符,默认空⽩字符;-v:指定变量-v var=value:⾃定义变量program:PATTERN{ ACTION STATEMENTS;...} (语句之间⽤ ; 分隔)PATTERN--模式,这意味着并不是对⽂件中的每⼀⾏进⾏处理,⽽是处理那些能够被模式匹配到的⾏,不跟模式表⽰全⽂;ACTION--常见的处理机制是打印,命令有print和printf.变量常见内置变量 FS:切割时的分隔符,默认为空⽩字符; OFS:切割后输出时的分隔符,默认为空⽩字符; RS:输⼊时的换⾏符,默认为'\n'; ORS:输出时的换⾏符,默认为'\n'; NF:字段数量 ( $NF表⽰最后⼀个字段); NR:⾏数; FNR:分别计算各⽂件的⾏数; FILENAME:当前⽂件名; ARGC:命令⾏参数的个数; ARGV:数组,保存的是命令⾏所给定的各参数⽰例:awk -v FS=: '{print $1}' /etc/passwd (相当于awk -F: "{print $1}" /etc/passwd)awk -v FS=: -v OFS=, '{print $1,$2}' /etc/passwdawk -v RS=' ' '{print}' /etc/issueawk '{print NF}' /etc/fstab (可对⽐ awk '{print $NF}' /etc/fstab,$NF表⽰最后⼀个字段)awk 'BEGIN{print ARGC}' /etc/fstab /etc/issue (命令⾏参数有3个,分别为awk,/etc/fstab,/etc/issue)awk 'BEGIN{print ARGV[#]}' /etc/fstab /etc/issue (#表⽰索引下标)⾃定义变量两种⽅式可⾃定义变量:(1) -v var=value(2) 在program中直接定义⽰例: awk -v test="hello gawk" 'BEGIN{print test}' (相当于awk 'BEGIN{test="hello gawk";print test}')打印输出printprint item1,item2,...⽰例:tail -5 /etc/fstab | awk '{print $2,$4}' ($1..$#:内置变量,表⽰分隔后的字段)tail -5 /etc/fstab | awk '{print "hello:",$2,$4}' (注意,{}只能由单引号'' 引起来,不能⽤双引号"")要点:(1) 逗号,作为不同字段的分隔符;(2) item可以是字符串,数值,当前记录的字段、变量或awk的表达式;(3) 如省略item,相当于print $0(打印所有元素;$0表⽰所有字段)printf格式化输出:printf FORMAT,item1,item2,...释义:(1) FORMAT必须给出;(2) 不会⾃动换⾏,需要显式给出换⾏控制符,'\n';(3) FORMAT中需要分别为后⾯的每个item指定⼀个格式化符号;格式符:%c:显⽰字符的ASCII码;%d,%i:显⽰⼗进制整数;%e,%E:科学计数法数值显⽰;%f:显⽰为浮点数;%g,%G:以科学计数法或浮点形式显⽰数值;%s:显⽰字符串;%u:⽆符号整数;%%:显⽰%⾃⾝修饰符:#[.#]:第⼀个数字控制显⽰的宽度;第⼆个#表⽰⼩数点后的精度⽰例: %-3.1f,其中 '-' 表⽰左对齐;%+5.2d,其中 '+' 会显⽰数值的符号 awk -F: '{printf "Uername:%s, UID:%d\n",$1,$3}' /etc/passwd awk -F: '{printf "Uername:%-15s, UID:%d\n",$1,$3}' /etc/passwd操作符 算术操作符:x+y,x-y,x*y,x/y,x^y(多少次⽅),x%y 赋值操作符:=,+=,-=,*=,/=,%=,^=,++,-- ⽐较操作符:>,>=,<,<=,!=,== 模式匹配符:~:是否匹配;!~:是否不匹配 逻辑操作符:&&,||,! 函数调⽤:function_name(argu1,argu2,...) 条件表达式:selector ? if-true-expression : if-false-expression⽰例: awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s : %-s\n",$1,usertype}' /etc/passwd awk '!/^UUID/{print $0}' /etc/fstab awk -F: '$3>1000{print $1,$3}' /etc/passwd awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwdPATTERN(1) /regular expression/:仅处理被模式匹配到的⾏;(2) relational expression:关系表达式,为"真"时处理 ("真":结果是⾮0值或⾮空字符串);(3) line ranges:⾏范围 (startline, endline 或 /pat1/, /pat2/);注意:此处⾏范围不⽀持直接给出数字的格式⽰例: awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd awk -F: '/^h/,/^s/{print $1}' /etc/passwd(4) BEGIN/END模式:BEGIN{}: 仅在开始处理⽂件中的⽂本之前执⾏⼀次;END{}:仅在⽂本处理完成之后执⾏⼀次⽰例: head /etc/passwd | awk -F: 'BEGIN{print "username uid"}{printf "%-12s%-5s\n",$1,$3}END{printf "%10s\n","END"}'控制语句if-else语法:if(condition) statement [else statement]使⽤场景:对awk取得的整⾏或某个字段做条件判断.⽰例:awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwdawk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwdawk '{if(NF>5) print $0}' /etc/fstabdf -h | awk -F% '/^\/dev/{print $1}' | awk '{if($NF>=20) print $1}'while and do while语法:while(condition) statement (条件"真"时进⼊循环;条件"假"时退出循环)do statement while(condition) (⾄少执⾏⼀次循环体)使⽤场景:对⼀⾏内的多个字段逐⼀处理时使⽤;对数组中的各元素逐⼀处理时使⽤.⽰例:awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfgawk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfgfor语法:for(expr1;expr2;expr3) statementfor(variable assignment;condition;iteration process) {for-body}⽰例:awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg特殊⽤法:遍历数组中的元素语法:for(var in array) {for-body}switch语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ...; default: statement} break and continuebreak:终⽌循环continue:中断本次循环继续下⼀轮next提前结束对本⾏的处理⽽直接进⼊下⼀⾏;⽰例:awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwdarray数组1) 关联数组:array[index-expression]index-expression:①可使⽤任意字符串;字符串要使⽤双引号;②如果某数组元素事先不存在,在引⽤时,awk会⾃动创建此元素,并将其值初始化为"空串"2) 若要判断数组中是否存在某元素,要使⽤"index in array"格式进⾏;3) 若要遍历数组中的每个元素,要使⽤for循环:for(var in array) {for-body}⽰例:awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}' netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state){ print i,state[i]}}'awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/access_logawk '/^UUID/{fs[$3]++}END{for(i in fs){print i,fs[i]}}' /etc/fstabawk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstabnetstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state){print i,state[i]}}'内置函数rand():返回0和1之间⼀个随机数;length([s]):返回指定字符串的长度;sub(r,s,[t]):以r表⽰的模式来查找t所表⽰的字符中的匹配的内容,并将其第⼀次出现替换为s所表⽰的内容; gsub(r,s,[t]):以r表⽰的模式来查找t所表⽰的字符中的匹配的内容,并将其所有出现均替换为s所表⽰的内容; split(s,a,[r]):以r为分隔符切割字符s,并将切割后的结果保存⾄a所表⽰的数组中⽰例:netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'awk '/^[[:space:]]*kernel/{i=1;while(i<=NF){if(length($i)>=7)print $i,length($i);i++}}' /etc/grub.conf。
awk的使用方式前面曾经说过,awk提供了适应多种需要的不同解决方案,它们是:一、awk命令行,你可以象使用普通UNIX命令一样使用awk,在命令行中你也可以使用awk 程序设计语言,虽然awk支持多行的录入,但是录入长长的命令行并保证其正确无误却是一件令人头疼的事,因此,这种方法一般只用于解决简单的问题。
当然,你也可以在shell script 程序中引用awk命令行甚至awk程序脚本。
二、使用-f选项调用awk程序。
awk允许将一段awk程序写入一个文本文件,然后在awk 命令行中用-f选项调用并执行这段程序。
具体的方法我们将在后面的awk语法中讲到。
三、利用命令解释器调用awk程序:利用UNIX支持的命令解释器功能,我们可以将一段awk程序写入文本文件,然后在它的第一行加上:#!/bin/awk -f并赋予这个文本文件以执行的权限。
这样做之后,你就可以在命令行中用类似于下面这样的方式调用并执行这段awk程序了。
$awk脚本文本名待处理文件awk的语法:与其它UNIX命令一样,awk拥有自己的语法:awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]参数说明:-F re:允许awk更改其字段分隔符。
parameter: 该参数帮助为不同的变量赋值。
'prog': awk的程序语句段。
这个语句段必须用单拓号:'和'括起,以防被shell解释。
这个程序语句段的标准形式为:'pattern {action}'其中pattern参数可以是egrep正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。
与sed类似,你也可以使用","分开两样式以选择某个范围。
关于匹配的细节,你可以参考附录,如果仍不懂的话,找本UNIX书学学grep和sed(本人是在学习ed 时掌握匹配技术的)。
window awk命令用法
`awk`命令是一种文本处理工具,它逐行扫描输入文件,根据
指定的规则进行模式匹配和处理。
以下是`awk`命令的一些常
见用法:
1. 基本语法:
```
awk 'pattern { actions }' input_file
```
其中,`pattern`是用来匹配文本行的表达式,`actions`是在匹
配到文本行时要执行的动作,`input_file`是要处理的输入文件。
2. 打印整行:
```
awk '{ print }' input_file
```
上述命令将打印输入文件中的每一行。
3. 打印指定字段:
```
awk '{ print $1, $NF }' input_file
```
上述命令将打印输入文件中每一行的第一个字段和最后一个
字段。
4. 按条件筛选行:
```
awk '/pattern/ { print }' input_file
```
上述命令将打印含有指定模式的行。
5. 使用分隔符:
```
awk -F':' '{ print $1, $NF }' input_file
```
上述命令将使用冒号作为分隔符,打印输入文件中每一行的第一个字段和最后一个字段。
6. 使用内置变量:
```
awk '{ sum += $1 } END { print sum }' input_file
```
上述命令将计算输入文件中第一个字段的总和并打印。
7. 修改字段分隔符:
```
awk 'BEGIN { FS=":" } { print $1, $NF }' input_file
```
上述命令将在处理输入文件之前修改字段分隔符为冒号。
这只是`awk`命令的一些常见用法示例,`awk`有许多其他功能和选项,可以根据需要进一步探索。