awk分隔符学习
- 格式:docx
- 大小:15.71 KB
- 文档页数:3
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是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是AWK 的GNU 版本。
awk其名称得自于它的创始人Alfred Aho 、Peter Weinberger 和Brian Kernighan 姓氏的首个字母。
实际上AWK 的确拥有自己的语言:AWK 程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。
它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
使用方法awk '{pattern + action}' {filenames}尽管操作可能会很复杂,但语法总是这样,其中pattern 表示AWK 在数据中查找的内容,而action 是在找到匹配内容时所执行的一系列命令。
花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。
完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。
awk每接收文件的一行,然后执行相应的命令,来处理文本。
调用awk有三种方式调用awk1.命令行方式awk [-F field-separator] 'commands' input-file(s)其中,commands 是真正awk命令,[-F域分隔符]是可选的。
input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。
awk命令中默认的字段分隔符1.引言1.1 概述概述部分的内容可以如下所示:引言部分是对该篇文章的简要介绍。
在本文中,我们将探讨awk命令中的默认字段分隔符的重要性以及使用。
AWK是一种强大的文本处理工具,广泛应用于Linux和Unix系统中。
它的灵活性和高效性使得它成为处理大型数据文件的理想选择。
本文的主要目的是介绍并深入了解awk命令中的默认字段分隔符。
在awk命令中,默认情况下,字段分隔符是空格或制表符。
然而,很多时候,我们需要根据具体情况自定义字段分隔符以便更好地处理文本数据。
本文将首先介绍awk命令的基本概念和语法,然后重点讨论默认字段分隔符的作用和使用方法。
我们将详细说明如何使用FS变量来自定义字段分隔符,以及如何利用默认字段分隔符进行文本数据的处理和分析。
此外,我们还将探讨默认字段分隔符的重要性,并讨论在不同情况下选择合适的字段分隔符的策略。
了解和灵活运用字段分隔符将帮助我们更好地处理和分析文本数据,从而提高工作效率和准确性。
最后,本文将总结所述内容,并对awk命令中默认字段分隔符的重要性进行深入的讨论。
希望通过这篇文章的阅读,读者能够更好地理解和运用awk命令中的默认字段分隔符,从而更加高效地处理文本数据。
1.2 文章结构文章结构部分的内容:本文将围绕awk命令中的默认字段分隔符展开讨论。
首先,介绍awk 命令的基本概念和用途,以便读者对本文的主题有一个基本的了解。
接着,详细讲解awk命令中的默认字段分隔符。
默认情况下,awk命令使用空格作为字段分隔符,但也可以使用其他字符作为分隔符进行字段的划分。
本文将深入探讨awk命令中该字段分隔符的使用方法和技巧,并提供一些实际应用的案例。
在结论部分,对awk命令中默认字段分隔符的重要性进行总结和讨论,指出在awk命令使用过程中正确设置字段分隔符的重要性,并提供一些建议和实用技巧。
通过本文的阅读,读者将对awk命令中默认字段分隔符有一个更加全面的了解,能够更加熟练地运用该命令进行数据处理和分析。
awk中ofs用法awk中ofs用法1. 什么是awk中的ofs在awk中,ofs是一个内建变量,它代表了输出字段分隔符(Output Field Separator)。
2. 如何设置ofs我们可以使用-v选项在awk命令中设置ofs的值,也可以在awk 脚本中使用BEGIN模块来设置。
以下是两种设置ofs的方式:# 在awk命令中设置ofsawk -v OFS=":" '{print $1, $2}'# 在awk脚本中设置ofsawk 'BEGIN {OFS="-"} {print $1, $2}'上述示例中,OFS的值分别被设置为:和-。
3. 使用ofs分隔输出字段在awk中,默认情况下,输出字段是以空格作为分隔符的。
我们可以通过设置ofs来改变输出字段的分隔符。
例如,我们有以下输入文件``:apple orange banana使用默认的ofs,运行以下命令:awk '{print $1, $2}'输出结果将会是:apple orange现在,我们可以将ofs设置为:来改变输出字段的分隔符:awk -v OFS=":" '{print $1, $2}'输出结果将会是:apple:orange4. 使用ofs连接输出字段除了作为分隔符,ofs还可以用来连接输出字段。
例如,我们有以下输入文件``:John Smith使用默认的ofs,运行以下命令:awk '{print $1, $2}'输出结果将会是:John Smith现在,我们可以将ofs设置为空格来连接输出字段:awk -v OFS=" " '{print $1, $2}'输出结果将会是:John Smith我们也可以将ofs设置为其他的字符串来连接输出字段:awk -v OFS=", " '{print $1, $2}'输出结果将会是:John, Smith5. 使用ofs对输出格式进行控制除了作为分隔符和连接符,ofs还可以用来对输出格式进行控制。
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 是一种流行的文本处理工具,它可以用于在文本文件中搜索、提取和修改数据。
基本语法:
Copy code
awk 'pattern { action }' file
其中,pattern 是一个正则表达式,用于匹配文本中的行。
action 是在匹配行上执行的操作。
file 是要处理的文件。
例如,使用awk 打印文件中所有以"root" 开头的行:
Copy code
awk '/^root/ {print}' /etc/passwd
AWK 也支持通过变量来操作文本数据。
比如,使用awk 统计文件中每行字符的个数:
Copy code
awk '{print length}' file
AWK还支持分隔符,默认是空格,可以使用-F 选项指定分隔符
例如,使用awk 打印CSV 文件中的第二列:
Copy code
awk -F, '{print $2}' file.csv
总之,AWK是一种强大的文本处理工具,可以用于在文本文件中搜索、提取和修改数据。
它具有简单的语法和强大的功能,在数据分析、日志分析和其他文本处理任务中非常有用。
Linux命令高级技巧使用awk命令进行文本处理和数据提取Linux命令高级技巧:使用awk命令进行文本处理和数据提取在Linux系统中,awk是一种强大的文本处理工具,它可以用于处理数据文件、生成报表以及提取文本中的特定信息。
awk命令的灵活和高效使得它成为Linux用户必备的工具之一。
本文将介绍awk命令的基本用法和高级技巧,帮助读者更好地利用awk进行文本处理和数据提取。
1. awk命令基本语法和工作原理awk命令的基本语法为:```awk 'pattern { action }' filename```其中,pattern是用于匹配文本的模式,action是在匹配成功后执行的操作。
awk处理文本的方式是逐行读取文件,按照指定的模式进行匹配,并执行相应的操作。
操作可以是打印、计算、替换等。
下面是一个简单的示例:```awk '/keyword/ { print $1 }' filename```该命令表示在filename文件中匹配包含关键字"keyword"的行,并打印每行的第一个字段。
2. 使用awk命令进行文本处理awk命令在文本处理方面有着广泛的应用。
它可以对文本进行排序、过滤、计算和格式化等操作。
下面介绍几个常用的awk命令技巧。
2.1 文本过滤和匹配通过awk命令可以方便地对文本进行过滤和匹配。
例如,要过滤出包含特定关键字的行,可以使用如下命令:```awk '/keyword/' filename```该命令将输出filename文件中所有包含关键字"keyword"的行。
2.2 提取字段awk命令可以提取文本中的指定字段。
字段之间以空格或制表符分隔,默认情况下,awk将每行数据的第一个字段标记为$1,第二个字段标记为$2,依此类推。
例如,要提取文件中的第二个字段,可以使用如下命令:```awk '{ print $2 }' filename```该命令将输出filename文件中每一行的第二个字段。
Linux命令高级技巧使用awk和cut命令进行文本处理和切割Linux命令高级技巧:使用awk和cut命令进行文本处理和切割在Linux系统中,命令行是一种非常强大和灵活的工具,可以用于各种文本处理和切割任务。
其中,awk和cut命令是两个常用的命令,它们可以帮助我们高效地操作文本数据。
本文将介绍如何使用awk和cut命令进行文本处理和切割,并给出一些实际应用示例。
一、使用awk命令进行文本处理awk是一种编程语言,也是一种强大的文本处理工具。
它可以按照指定的字段分隔符将文本数据切割成多个字段,并对每个字段进行处理和转换。
以下是awk命令的常用语法格式:```awk [选项] '条件表达式 { 动作 }' 文件名```在这个语法中,选项是可选的,可以用来指定一些参数。
条件表达式用于筛选满足条件的文本行,动作则是对每个满足条件的行进行的操作。
文件名是需要处理的文本文件。
1. 切割字段awk命令最基本的用法是切割字段。
通过指定字段分隔符,我们可以将文本数据按照指定的字段进行切割。
默认情况下,awk使用空格作为字段分隔符。
以下是一个示例:假设有一个名为data.txt的文本文件,内容如下:```Tom 20 MaleJohn 25 MaleLisa 18 Female```我们需要提取每行中的第一个字段和第三个字段,可以使用以下awk命令:```awk '{print $1, $3}' data.txt```执行上述命令后,会输出以下结果:```Tom MaleJohn MaleLisa Female```可以看到,每行的第一个字段和第三个字段被提取出来并输出。
2. 指定字段分隔符默认情况下,awk使用空格作为字段分隔符。
但是,我们也可以通过指定-F选项来指定其他的字段分隔符。
以下是一个示例:假设有一个名为data.csv的文本文件,内容如下:```Tom,20,MaleJohn,25,MaleLisa,18,Female```我们需要提取每行中的第一个字段和第三个字段,可以使用以下awk命令:```awk -F ',' '{print $1, $3}' data.csv```执行上述命令后,会输出以下结果:```Tom MaleJohn MaleLisa Female```可以看到,通过指定-F ','选项,我们成功地将每行的字段按逗号进行了切割。
awk使用规则awk 是一种很棒的语言。
awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。
与某些语言不同,awk 的语法较为常见。
它借鉴了某些语言的一些精华部分,如C 语言、python 和bash(虽然在技术上,awk 比python 和bash 早创建)。
awk 是那种一旦学会了就会成为您战略编码库的主要部分的语言。
第一个awk让我们继续,开始使用awk,以了解其工作原理。
在命令行中输入以下命令:$ awk '{ print }' /etc/passwd您将会见到/etc/passwd 文件的内容出现在眼前。
现在,解释awk 做了些什么。
调用a wk 时,我们指定/etc/passwd 作为输入文件。
执行awk 时,它依次对/etc/passwd 中的每一行执行print 命令。
所有输出都发送到stdout,所得到的结果与与执行catting /etc/passwd完全相同。
现在,解释{ print } 代码块。
在awk 中,花括号用于将几块代码组合到一起,这一点类似于C 语言。
在代码块中只有一条print 命令。
在awk 中,如果只出现print 命令,那么将打印当前行的全部内容。
这里是另一个awk 示例,它的作用与上例完全相同:$ awk '{ print $0 }' /etc/passwd在awk 中,$0 变量表示整个当前行,所以print 和print $0 的作用完全一样。
如果您愿意,可以创建一个awk 程序,让它输出与输入数据完全无关的数据。
以下是一个示例:$ awk '{ print "" }' /etc/passwd只要将"" 字符串传递给print 命令,它就会打印空白行。
如果测试该脚本,将会发现对于/etc/passwd 文件中的每一行,awk 都输出一个空白行。
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 都会执⾏每个脚本代码块⼀次。
ffmpeg awk用法-回复关于ffmpeg和awk的使用方法,请跟随下面的步骤,我们将一步一步地回答您的问题。
第一步:什么是FFmpeg?FFmpeg是一个开源的音视频处理框架,它提供了处理音视频数据的工具和库。
它可以通过命令行进行操作,也可以通过各种编程语言进行调用。
FFmpeg可以完成许多任务,包括视频转码、音频转换、视频剪辑、音频提取等等。
第二步:FFmpeg的安装和基本用法。
1. 从FFmpeg的官方网站(2. 安装FFmpeg,在命令行窗口输入“ffmpeg -version”来验证安装是否成功。
3. 使用FFmpeg进行基本操作,例如转码一个视频文件。
在命令行窗口输入以下命令:ffmpeg -i input.mp4 output.mp4这将把名为input.mp4的视频文件转码为output.mp4。
第三步:FFmpeg的高级用法。
1. 视频剪辑:使用FFmpeg能够将一个视频文件剪辑成多个片段。
例如,剪辑一个视频的前10秒钟,并输出为output.mp4,可以使用以下命令:ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:10 -c copy output.mp4 2. 视频合并:使用FFmpeg能够将多个视频文件合并成一个。
例如,合并两个视频文件input1.mp4和input2.mp4,并输出为output.mp4,可以使用以下命令:ffmpeg -i "concat:input1.mp4 input2.mp4" -c copy output.mp4 3. 视频截图:使用FFmpeg能够从视频文件中提取静态图像。
例如,从视频文件input.mp4的第20秒提取一张图片,可以使用以下命令:ffmpeg -i input.mp4 -ss 00:00:20 -vframes 1 output.jpg第四步:什么是awk?Awk是一种强大的文本处理工具,它可以用于解析和操作文本文件。
高级字符串处理技巧使用sed和awk进行字符串替换和处理在计算机编程中,字符串处理是一项非常重要的技能,而使用sed 和awk工具可以帮助我们更加高效和灵活地处理字符串。
本文将介绍sed和awk的基本用法以及一些高级的字符串处理技巧。
一、sed工具sed(Stream Editor)是一个流编辑器,能够对文本进行一行一行的处理,常用于替换、删除、插入字符串等操作。
1. 替换字符串sed命令的替换字符串功能非常强大,格式为:```sed 's/要替换的字符串/新的字符串/g' 文件名```其中,`s`代表substitute,字符串被替换的标志是`/`,`g`表示进行全局替换。
例如,我们要将文件file.txt中的所有"apple"替换为"orange",可以使用以下sed命令:```sed 's/apple/orange/g' file.txt```2. 删除特定行sed还可以删除文件中的特定行,常用的命令是`d`,例如:```sed '2d' file.txt```上述命令将删除文件file.txt中的第二行。
3. 插入字符串sed可以在文件的某一行前或某一行后插入字符串,分别使用命令`i`和`a`。
例如:```sed '2i\This is a new line' file.txt```上述命令将在文件file.txt的第二行前插入"This is a new line"。
二、awk工具awk是一种强大的文本处理工具,它可以用于查找、提取和处理文件中的数据。
它将文件按行分割成字段,通过指定的条件和操作来处理这些字段。
1. 提取特定字段awk默认将每一行的字段分割成为$1、$2、$3...,我们可以使用这些变量来提取特定字段。
例如,提取文件file.txt中的第一列可以使用以下命令:```awk '{print $1}' file.txt```2. 使用条件进行处理awk可以根据条件来处理数据,其中,使用`pattern { action }`的格式。
AWK技巧(取倒列,过滤⾏,匹配,不匹配,内置变量等)使⽤awk取某⼀⾏数据中的倒数第N列:$(NF-(n-1))⽐如取/etc/passwd⽂件中的第2列、倒数第1、倒数第2、倒数第4列(以冒号为分隔符)。
($NF表⽰倒数第⼀列,$(NF-1)表⽰倒数第⼆列)[root@ipsan-node06 ~]# cat /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin[root@ipsan-node06 ~]# awk -F":" '{print $2,$(NF),$(NF-1),$(NF-3)}' /etc/passwdx /bin/bash /root 0x /sbin/nologin /bin 1x /sbin/nologin /sbin 2x /sbin/nologin /var/adm 4x /sbin/nologin /var/spool/lpd 7x /bin/sync /sbin 0x /sbin/shutdown /sbin 0x /sbin/halt /sbin 0x /sbin/nologin /var/spool/mail 12x /sbin/nologin /root 0linux实现将⽂本⽂件每⼀⾏中相同第⼀列对应的其他列进⾏拼接[root@jump-v4 ~]# sort b.txt|uniq1 341 492 452 483 543 573 89[root@jump-v4 ~]# sort b.txt|uniq|awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}'1: 34 492: 45 483: 54 57 89命令解析:1)⾸先sort test|uniq实现对test⽂件的去重,去掉了重复的 1 49,保留不同的⾏;2)awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}' 表⽰的含义是:将每⼀⾏的第⼀列最为数组a的key,第⼆列作为a的value,同时碰到相同的key,就把其值进⾏拼接,linux的shell的字符串拼接形式为str = (str “ ” $var),最后遍历数组a,其中i为数组a的每⼀个key,a[i]为key对应的值;使⽤awk命令获取⽂本的某⼀⾏,某⼀列的技巧:1)打印⽂件的第⼀列(域) : awk '{print $1}' filename2)打印⽂件的前两列(域) : awk '{print $1,$2}' filename3)打印完第⼀列,然后打印第⼆列: awk '{print $1 $2}' filename4)打印⽂本⽂件的总⾏数: awk 'END{print NR}' filename5)打印⽂本第⼀⾏:awk 'NR==1{print}' filename6)打印⽂本第⼆⾏第⼀列:sed -n "2, 1p" filename | awk 'print $1'Awk取⽂件中的指定数据[root@jump-v4 ~]# cat a.txt123.122.123.12 12121212121.2332.121.11 232323255.255.255.255 21321123.122.123.12 12121212123.122.123.12 1212121er2123.122.123.12 12121212eer123.122.123.12 12121212ere255.255.255.255 21321121.2332.121.11 232323255.255.255.255 21321[root@jump-v4 ~]# cat a.txt|awk '{print $1}'123.122.123.12121.2332.121.11255.255.255.255123.122.123.12123.122.123.12123.122.123.12123.122.123.12255.255.255.255121.2332.121.11255.255.255.255[root@jump-v4 ~]# cat a.txt|awk '{print $1}'|sort|uniq -c2 121.2332.121.115 123.122.123.123 255.255.255.255[root@jump-v4 ~]# cat a.txt|awk '{print $1}'|sort|uniq -c|awk '{print $2,$1}'121.2332.121.11 2123.122.123.12 5255.255.255.255 3[root@jump-v4 ~]# cat a.txt|awk '{print $1}'|sort|uniq -c|awk '{print $2,$1}'|sort -k2 -rn123.122.123.12 5255.255.255.255 3121.2332.121.11 2linux⽂件按⼤⼩来排序[root@cdn ~]# ls -s | sort -k 1 -n表⽰对第⼀个字段(即⽂件⼤⼩)按数值⼤⼩进⾏排序;如果想倒序,可以增加-r参数;sort命令可进⾏排序;-k参数表⽰对第⼏个字段进⾏排序;ls -s:第⼀列显⽰的是⽂件⼤⼩定时删除resin⽇志的脚本,每⼩时删除⼀次[root@cdn ~]# cat resin-log.sh#!/bin/bashcd /data/log/resin && find /data/log/resin \( -name "*jvm-app-0.log.*" -a ! -name "*.gz" \) -a -mmin +30 -exec gzip {} \; [root@cdn ~]# crontab -l0 * * * * /bin/bash -x /root/resin-log.sh >/dev/null 2>&1awk 获取某些列的某些⾏(打印或不打印第⼏⾏)NR==n 表⽰打印第n⾏NR!=n 表⽰不打印第n⾏1)取test.txt⽂件中的第1,2列,不打印第⼀⾏[root@bz4citestap1014 app_zhibiao.sh]# cat test.txtwang 11 aashi 22 bbkevin 33 ccgrace 44 ddhui 55 ee[root@bz4citestap1014 app_zhibiao.sh]# awk 'NR!=1 {print $1,$2}' test.txtshi 22kevin 33grace 44hui 552)取test.txt⽂件中的第3列的第2⾏[root@bz4citestap1014 app_zhibiao.sh]# awk 'NR==2 {print $3}' test.txtbbawk中的"匹配"与"不匹配"~ 匹配正则!~ 不匹配正则== 等于!= 不等于[root@kevin~]# cat test.txtafjdkj 80lkdjfkja 8080dfjj 80jdsalfj 808080jasj 80jg 80linuxidc 8080 ajfkjasf 8080 linuxidcwang bokevin graceha 808801) 打印上⾯test⽂件中第⼆列匹配80开头并以80结束的⾏[root@kevin~]# awk '{if($2~/^80$/)print}' test.txtafjdkj 80dfjj 80jasj 80jg 80linuxidc 80asf 802)打印上⾯test⽂件中第⼆列中不匹配80开头并以80结束的⾏[root@kevin~]# awk '{if($2!~/^80$/)print}' test.txtlkdjfkja 8080jdsalfj 80808080 ajfkj80 linuxidcwang bokevin graceha 808803)打印上⾯test⽂件中第⼆列是"bo"的⾏[root@kevin~]# cat test.txt |awk '{if($2=="bo")print}'wang boAWK的内置变量(NF、NR、FNR、FS、OFS、RS、ORS)NF 字段个数,(读取的列数)NR 记录数(⾏号),从1开始,新的⽂件延续上⾯的计数,新⽂件不从1开始FNR 读取⽂件的记录数(⾏号),从1开始,新的⽂件重新从1开始计数FS 输⼊字段分隔符,默认是空格OFS 输出字段分隔符默认也是空格RS 输⼊⾏分隔符,默认为换⾏符ORS 输出⾏分隔符,默认为换⾏符⽰例⽂件test:[rootkevin ~]# cat testzhong guo ren is noce!beijing is a good city。
awk所有常⽤语法awk [OPTIONS] PROGRAM FILE...选项:-F 指定分隔符-f 引⽤awk脚本-v VAR=VALUE 定义⼀个变量传递给PROGRAM,但是这⾥的变量BEGIN读不了,只有PROGRAM和END才能读。
PROGRAM由“ PATTERNS{ACTION;ACTION...} ”组成PATTERNS和ACTION可以其中⼀个不写PATTERNS不写表⽰所有记录。
ACTION不写默认为print $0记录(record)和字段(filed):记录是根据RS变量的值分割,默认情况下是换⾏符,也就是⼀⾏就是⼀个记录。
字段是根据FS变量的值定义的,⽤于分割记录成字段。
引⽤记录的字段:$0 代表整个记录$1 第⼀个字段$N 第N个字段AWK的变量:1、内建变量,由AWK⾃⾝内置的⼀些变量。
FILENAME:⽂件名。
FS:字段分隔符,默认是空格和制表符。
OFS:每个字段默认的输出分割符号。
RS:记录分隔符,默认是换⾏符。
ORS:每个记录默认的输出分割符号。
NR:当前记录所在的⾏号(多个⽂件时会重置⾏号)FNR:当多个⽂件时不会重置⾏号。
NF:当即字段的段号。
IGNORECASE:匹配时是否忽略⼤⼩写。
RLENGTH:由match函数所匹配到的⼦字符串的长度。
RSTART:由match函数所匹配到的⼦字符串的起始位置2、⽤户⾃定义变量·通过”awk -v 变量名=变量值“ 定义并使⽤。
·在ACTION内部直接定义。
变量的值可以使⽤0开头表⽰8进制,0x开头表⽰16进制。
使⽤变量:不管时内建变量还是⽤户⾃定义变量,直接写变量名即可,不需要加”$“符号来引⽤变量。
但是for循环内的变量需要加”$“来引⽤。
PATTERNS: ⽤于对判断是否对当前记录应⽤ACTION这⾥的PATTERN不单单可以使⽤正则表达式,还可以是条件判断等。
具体如下:1、/正则表达式/2、/正则/ && /正则/3、/正则/ || /正则/4、PATTERN ? PATTERN : PATTERN #(三元运算符)5、!PATTERN # 取反6、PATTERN,PATTERN # 多个PATTERN7、BEGIN8、END9、匹配操作符~ PATTERN 匹配指定正则表达式!~ PATTERN 不匹配指定正则表达式10、算数运算符++ --+= -= *= /= %=+ - * / %11、逻辑运算&&||!awk -F: '$1~/^r/ && $3>1000{print $0}' /etc/passwd12、(PATTERN) 优先计算括号内的表达式如: awk -F: '!($3>1000){print $1,$3}'ACTION:print ITEM,ITEM... : # 打印⽂本,ITEM之间默认⽤OFS变量的值隔开输出。
Mac命令行数据处理技巧使用AWK和SED进行文本处理在使用Mac命令行进行数据处理时,AWK和SED是两个非常强大和常用的工具。
它们可以帮助我们快速有效地处理文本数据,提取需要的信息,并对数据进行格式化和转换。
本文将介绍AWK和SED的基本用法和常见技巧,以帮助读者更好地利用这两个工具进行文本处理。
一、AWK的基本用法AWK是一种用于处理和分析文本数据的编程语言。
它提供了强大的文本处理能力,并且非常灵活易用。
下面是AWK的基本用法及常见技巧:1. 提取指定列的数据使用AWK我们可以轻松地提取指定列的数据。
例如,如果我们有一个csv文件,其中包含姓名、年龄和性别信息,我们可以使用以下命令提取出姓名列的数据:```awk -F ',' '{print $1}' file.csv```上述命令中,-F参数指定了字段分隔符为逗号(,),而$1表示第一个列。
通过这个命令,我们可以打印出csv文件中所有行的第一列数据。
2. 利用条件过滤数据AWK还可以根据条件过滤数据。
例如,我们可以使用以下命令过滤出年龄大于等于18岁的人的数据:```awk -F ',' '$2 >= 18 {print $0}' file.csv```上述命令中,$2表示第二列,$0表示整行数据。
通过这个命令,我们可以打印出csv文件中所有年龄大于等于18岁的人的数据。
3. 计算列的和、平均值等统计信息使用AWK,我们可以很方便地计算列的和、平均值等统计信息。
例如,我们可以使用以下命令计算csv文件中年龄列的平均值:```awk -F ',' '{sum += $2; count++} END {print sum/count}' file.csv```上述命令中,sum和count是AWK的变量,分别用于累加和计数。
通过这个命令,我们可以打印出csv文件中年龄列的平均值。
在Linux中,awk命令默认使用空格作为分隔符来划分字段。
但是,可以通过使用`-F`选项指定自定义的分隔符。
例如,如果你想将以逗号分隔的文本文件作为输入,并使用逗号作为字段分隔符,可以这样使用awk命令:
```
awk -F',' '{print $1, $2}' file.txt
```
在上述例子中,`-F','`表示使用逗号作为字段分隔符,`$1`和`$2`表示第一个和第二个字段。
除了单个字符作为分隔符外,你还可以使用正则表达式作为分隔符。
例如,如果你的输入文件字段是用制表符分隔的,你可以使用以下命令:
```
awk -F'\t' '{print $1, $2}' file.txt
```
在这个例子中,`-F'\t'`表示使用制表符作为字段分隔符。
总之,通过使用`-F`选项,你可以在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从输⼊流中读取全然部的⾏之后即被运⾏。
linux下awk命令使用详解(实例)linux下awk命令使用详解(实例)分类: shell编程开发 2012-04-27 18:15 112人阅读评论(0) 收藏举报最近在搞linux系统脚本文件时,遇到了AWK以前培训的时候没有注意还有这样的命令,这里学习并整理了下!一、awk命令行模式:第一种,命令行方式,如:awk [-Ffield-separator] 'commands' input-file(s)这里commands是真正的awk命令,[-F域分隔符]是可选的,awk 默认使用空格分隔,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果浏览如passwd文件,此文件各域使用冒号作为分隔符,则必须使用-F选项:awk -F : 'commands' input-file第二种,将所有awk命令插入一个文件,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种,将所有awk命令插入一个单独文件,然后调用:awk -f awk-script-file input-file-f选项指明在文件awk-script-file的awk脚本,input-file是使用awk进行浏览的文件名awk脚本:awk脚本由各种操作和模式组成,根据分隔符(-F选项),默认为空格,读取的内容依次放置到对应的域中,一行一行记录读取,直到文件尾模式和动作:任何awk语句都是由模式和动作组成,在一个awk脚本中可能有许多语句。
模式部分决定动作语句何时触发及触发事件。
动作即对数据进行的操作,如果省去模式部分,动作将时刻保持执行状态模式可以是任何条件语句或复合语句或正则表达式,模式包含两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行;END语句用来在awk 完成文本浏览动作后打印输出文本总数和结尾状态标志,有动作必须使用{}括起来实际动作在大括号{}内指明,常用来做打印动作,但是还有更长的代码如if和循环looping语句及循环退出等,如果不指明采取什么动作,awk默认打印出所有浏览出的记录域和记录:awk执行时,其浏览标记为$1,$2...$n,这种方法称为域标记.使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域例:awk'{print $0}' temp.txt >sav.txt 表示打印所有域并把结果重定向到sav.txt中awk '{print $0}' temp.txt|tee sav.txt 和上例相似,不同的是将在屏幕上显示出来awk '{print $1,$4}'temp.txt 只打印出第1和第4域awk 'BEGIN {print "NAME GRADE\n-------------"} {print $1"\t"$4}'temp.txt表示打信息头,即输入的内容的第一行前加上"NAMEGRADE\n-------------",同时内容以tab分开awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp 同时打印信息头和信息尾条件操作符:<、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式匹配:awk'{if ($4~/ASIMA/) print $0}' temp 表示如果第四个域包含ASIMA,就打印整条awk '$0 ~ /ASIMA/' temp 表示只要整条包含ASIMA就打印出来精确匹配:awk'$3=="48" {print $0}'temp 只打印第3域等于"48"的记录不匹配:awk '$0 !~ /ASIMA/'temp 打印整条不包含ASIMA的记录不等于:awk '$1 != "asima"' temp小于:awk '{if ($1<$2) print $1 "is smaller"}'temp设置大小写:awk '/[Gg]reen/'temp 打印整条包含Green,或者green的记录任意字符:awk '$1 ~/^...a/'temp 打印第1域中第四个字符是a的记录,^行首,.任意字符或关系匹配:awk '$0~/(abc)|(efg)/' temp 使用|时,语句需要括起来AND与关系:awk '{if ( $1=="a" && $2=="b" )print $0}' tempOR或关系:awk '{if ($1=="a" || $1=="b") print $0}' temp二、awk内置变量:ARGC 命令行参数个数AGRV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,同- F选项NF 浏览记录的域个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符例:awk 'END {print NR}'temp 在最后打印已读记录条数awk '{print NF,NR,$0} END {print FILENAME}' tempawk '{if (NR>0 &&$4~/Brown/) print $0}' temp 至少存在一条记录且包含BrownNF的另一用法:echo $PWD | awk -F/ '{print$NF}' 显示当前目录名awk操作符:在awk中使用操作符,基本表达式可以划分成数字型、字符串型、变量型、域及数组元素设置输入域到变量名:awk'{name=$1;six=$3; if (six=="man") print name " is " six}'temp域值比较操作:awk 'BEGIN{BASE="27"} {if ($4<BASE) print $0}' temp修改数值域取值:(原输入文件不会被改变)awk '{if ($1=="asima")$6=$6-1;print $1,$6,$7}' temp修改文本域:awk '{if ($1=="asima) ($1=="desc");print $1}' temp只显示修改记录:(只显示所需要的,区别上一条命令,注意{})awk '{if ($1=="asima) {$1=="desc";print$1}}'temp创建新的输出域:awk '{$4=$3-$2; print $4}' temp统计列值:awk '(tot+=$3);END {print tot}'temp 会显示每列的内容awk '{(tot+=$3)};END {printtot}'temp 只显示最后的结果文件长度相加:ls -l|awk '/^[^d]/ {print$9"\t"$5} {tot+=$5} END{print "totKB:" tot}'只列出文件名:ls -l|awk'{print$9}' 常规情况文件名是第9域awk内置字符串函数:gsub(r,s)在整个$0中用s替代rawk'gsub(/name/,"xingming") {print $0}' tempgsub(r,s,t)在整个t中用s替代rindex(s,t)返回s中字符串t的第一位置awk 'BEGIN{print index("Sunny","ny")}'temp 返回4length(s)返回s的长度match(s,r)测试s是否包含匹配r的字符串awk'$1=="J.Lulu" {print match($1,"u")}'temp 返回4split(s,a,fs)在fs上将s分成序列aawk 'BEGIN{print split("12#345#6789",myarray,"#")"'返回3,同时myarray[1]="12", myarray[2]="345",myarray[3]="6789"sprint(fmt,exp)返回经fmt格式化后的expsub(r,s)从$0中最左边最长的子串中用s代替r(只更换第一遇到的匹配字符串)substr(s,p)返回字符串s中从p开始的后缀部分substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分printf函数的使用:字符转换:echo "65" |awk '{printf"%c\n",$0}' 输出Aawk 'BEGIN {printf"%f\n",999}' 输出999.000000格式化输出:awk'{printf "%-15s %s\n",$1,$3}' temp 将第一个域全部左对齐显示其他awk用法:向一行awk命令传值:awk '{if ($5<AGE) print $0}' AGE=10 tempwho | awk '{if ($1==user) print $1 " are in " $2 ' user=$LOGNAME使用环境变量awk脚本命令:开头使用 !/bin/awk -f ,如果没有这句话自含脚本将不能执行,例子:1.!/bin/awk-f2.# allcomment lines must start with a hash '#'3.#name: student_tot.awk4.# tocall: student_tot.awk grade.txt5.#prints total and average of club student points6.7.#print a header first8.BEGIN9.{10.print"Student Date Member No. Grade AgePoints Max"11.print"Name Joined Gained Point Available"12.print"=============================== =================================="13.}14.#let's add the scores of points gained15.(tot+=$6);16.#finished processing now let's print the total and averagepoint17.END18.{19.print "Club student total points :" tot20.print "Average Club Student points :" tot/N21.}[plain] view plaincopyprint?1.awk数组:awk的循环基本结构 For (element in array) print array[element]awk'BEGIN{record="123#456#789";split(record,myarray,"#")} END { for (i in myarray) {print myarray[i]} }[html] view plaincopyprint?1.awk -v MASS_UNPLUG=$MASS_UNPLUG '2.{3.<PRE class=html name="code"><SPAN style="WHITE-SPACE: pre"></SPAN>if ($0 ~ /^\/dev\/sd/) {4.<SPAN style="WHITE-SPACE: pre"></SPAN>print "umount " $2;5.<SPAN style="WHITE-SPACE: pre"></SPAN>if (system("umount " $2)) {6.<SPAN style="WHITE-SPACE: pre"></SPAN>print "umount fail!";7.<SPAN style="WHITE-SPACE: pre"></SPAN>if ($2 ~ /nand/) {8.<SPAN style="WHITE-SPACE: pre"></SPAN>if (plug_devs) {9.<SPAN style="WHITE-SPACE: pre"></SPAN>plug_devs = plug_devs " /dev/ null";10.<SPAN style="WHITE-SPACE: pre"></SPAN>} else {11.<SPAN style="WHITE-SPACE: pre"></SPAN>plug_devs = "/dev/null";12.<SPAN style="WHITE-SPACE: pre"></SPAN>}13.<SPAN style="WHITE-SPACE: pre"></SPAN>}14.<SPAN style="WHITE-SPACE: pre"></SPAN>}15.<SPAN style="WHITE-SPACE: pre"></SPAN>}</PRE>}END {system("echo \"/usr/mas s /dev/null&\" >> " MASS_UNPLUG);print "/usr/mass " plug_de vs " &";system("/usr/mass " plug_devs " &");} ' /proc/mounts<P ></P>16.<PRE></PRE>17.<BR>18.上面是我遇到的一个AWK的样例:19.<P></P>20.<P>功能就是:查找/proc/mount 文件中记录的一些挂载节点数据!</P>21.<P><BR>22.</P>23.<P></P>24.<BR>。
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。
3.请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答)。
解答:
说明:此题解答方法已经给大家讲解了不下15种,还可以有很多,在这里给大家着重讲下awk的技巧用法,希望大家能多重视老师的思路、思维过程,不过过分关注问题的答案,以便达到学一通十的效果。
方法一【此法为绿叶】:如果用awk来处理的话,一般的同学可能会用下面的办法实现:
[root@oldboy ~]# ifconfig eth0|grep 'inet
addr'|awk -F ":" '{print $2}'|awk '{print $1}' 10.0.0.162
小结:这个方法是常规方法,很好。
但是我们有没有更简单的awk实现方法呢?往下看。
方法二【此法为小红花】:通过awk同时使用多个分隔符来实现:
[root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F '[ :]' '{print $13}'
192.168.1.186
提示:本题通过使用空格或冒号来做分隔符,然后一次性取出结果,就是空格或冒号可以看做是同一个分隔符。
小结:这个方法很方便吧,同学们可以多用,选取包含IP 地址行的特殊关键字'inet addr’过滤然后,使用awk以空格和:同时做分隔符,然后取出需要的内容。
本答案的最大缺点就是计算$n的时候很费劲,因为inet 前面有多个空格,查到$13,真是不容易,如此看来从实现时间上可能还不如第一个方法快呢?那好引出我们今天的关键答案案例。
方法三【大红花出场】:通过awk同时使用多个分隔符,然后通过正则匹配多个分隔符的方法来实现:
[root@oldboy ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}'
10.0.0.185
我们来说明下这个简单易用的好办法:
提示:本题NR是行号,分隔符+号匹配,[]里一个或多个任意一个分隔符,这里就是匹配一个或多个冒号或空格。
1)awk -F 后面跟分隔符‘[空格:]+’,其中[空格:]多分隔符写法,意思是以空格或冒号做分隔,后面的"+"号是正则表达式,意思是匹配前面空格或冒号,两者之一的1个或1个以上。
2)NR==2和sed -n "2p",相当,意思都是选择第几行,例:[root@oldboy ~]# ifconfig eth0|awk NR==2。