linux命令awk用法
- 格式:docx
- 大小:19.16 KB
- 文档页数:2
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参数指定分隔符为冒号。
linux的awk命令用法AWK 是一个强大的文本处理工具,它处理文本文件的方法是基于行的,可以读取文件、处理文件并输出文件结果。
AWK 的名称来自于其开发者 Alfred Aho、Peter Weinberger和 Brian Kernighan 姓氏的首字母。
在Linux中,我们可以通过终端输入命令来使用 AWK 工具。
本文将介绍 AWK 命令的使用。
一、基本语法AWK 工具的基本语法为:awk '{pattern + action}' file_name其中,pattern 表示要匹配的文本模式,action 表示执行的操作,file_name 表示需要处理的文件名。
举个例子,我们可以使用下面的命令来查看一个文件的内容:其中,print 表示将文件内容输出。
在这里,pattern 为空,因此 awk 将匹配所有内容,而 action 是 print,表示将所有匹配到的内容都输出。
这个命令将显示文件file.txt 中的所有内容。
AWK 工具也可以通过管道命令将其结果传递给其他命令。
例如,我们可以将上述命令的输出结果传递给 less 命令,以便我们能够对文件的内容进行分页显示:二、匹配模式AWK 工具可以通过匹配模式来确定要执行操作的行。
在 AWK 中,模式可以是以下之一:1. 文本模式文本模式以单引号或双引号括起来,用于指定要匹配的文本字符串。
例如,我们可以使用下面的命令来匹配包含“Linux” 的行:在这个命令中,模式为 /Linux/,表示会匹配到所有包含字符串“Linux” 的行,而 action 为 print,表示将所有匹配到的行输出。
2. 行号模式我们可以使用行号模式来匹配行号,以便执行特定的操作。
例如,我们可以使用下面的命令来输出文件的第二行:我们也可以使用正则表达式的形式定义一个正则表达式,以便匹配文本的模式。
例如,我们可以使用下面的命令来匹配包含以大写字母开头的字符串的行:在这个命令中,模式为 /^[A-Z]/,表示只匹配以大写字母开头的行,并将匹配到的行输出。
linux awk 正则
AWK是一种文本处理工具,它支持使用正则表达式进行模式匹配和处理。
以下是一些常见的AWK正则表达式:
1. 匹配整个字符串:/pattern/,例如:/hello/表示匹配字符串中的“hello”。
2. 匹配字符串的开头:/^pattern/,例如:/^hello/表示匹配字符串开头的“hello”。
3. 匹配字符串的结尾:/pattern$/,例如:/world$/表示匹配字符串结尾的“world”。
4. 匹配特定字符集合:/[characters]/,例如:/[abc]/表示匹配包含字符“a”、“b”、“c”的字符串。
5.匹配单个字符:/./,例如:/./表示匹配任何单个字符。
6.匹配重复次数:/{n,m}/,例如:/[0-9]{3,5}/表示匹配3到5个数字的字符串。
7. 匹配0次或1次:/pattern?/,例如:/colou?r/表示匹配包含单词“color”或“colour”的字符串。
8. 匹配1次或多次:/pattern+/,例如:/bo+n/表示匹配一个或多个字母“o”的字符串。
9. 匹配0次或多次:/pattern*/,例如:/go*/表示匹配一个或多个字母“o”的字符串。
10. 匹配非字符集中的字符:/[^characters]/,例如:/[^aeiou]/表示匹配不包含元音字母的字符串。
Linux命令高级技巧使用awk命令进行字段提取和计算优化在Linux系统中,awk是一种强大的文本处理工具。
它可以用来从文件或输出中提取特定的字段,进行计算和操作。
本文将介绍如何使用awk命令进行字段提取和计算优化的高级技巧。
一、字段提取在awk命令中,可以使用-F选项指定字段的分隔符。
默认情况下,字段分隔符为制表符或空格。
我们可以根据实际需要来指定其他分隔符,例如逗号、冒号等。
下面是一个示例:awk -F, '{print $1}' file.txt上述命令将以逗号作为字段分隔符,提取文件file.txt中每行的第一个字段并输出。
此外,还可以使用substr函数来提取字段中的一部分内容。
例如,我们可以提取手机号码中的前三位:awk '{print substr($1,1,3)}' file.txt上述命令将提取文件file.txt中每行的第一个字段的前三个字符并输出。
二、字段计算awk命令不仅可以提取字段,还可以进行各种计算操作。
下面是一些常用的计算技巧。
1. 求和可以使用awk的内置变量sum来实现求和操作。
例如,我们可以计算file.txt文件中第二列的和:awk '{sum+=$2} END {print sum}' file.txt2. 求均值可以结合NR(行数)和sum来计算均值。
例如,我们可以计算file.txt文件中第二列的均值:awk '{sum+=$2} END {print sum/NR}' file.txt3. 最小值和最大值使用if语句可以实现最小值和最大值的计算。
例如,我们可以找出file.txt文件中第三列的最大值:awk 'BEGIN {max=0} {if($3>max) max=$3} END {print max}' file.txt4. 统计字段频率可以使用数组来统计字段出现的频率。
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 ','选项,我们成功地将每行的字段按逗号进行了切割。
Linux命令行使用技巧如何使用awk命令进行数据提取和分析awk是一种强大的文本处理工具,在Linux命令行中使用它可以进行数据提取和分析。
本文将介绍如何使用awk命令进行数据提取和分析的技巧。
一、什么是awk命令awk是一种用于文本处理的强大工具,它可以从文本文件中提取数据、处理数据以及生成报告等。
awk提供了丰富的内置函数和操作符,可以对数据进行各种操作和计算。
使用awk命令需要指定要执行的程序和要处理的文本文件。
二、awk命令的基本用法awk命令的基本用法为:```bashawk 'program' file```其中,program是awk的程序,可以是一行或多行命令;file是要处理的文本文件。
三、使用awk命令提取数据1. 提取指定字段我们可以使用awk命令提取文本文件中的特定字段。
假设我们有一个文本文件data.txt,内容如下:```name,age,genderTom,18,MaleAmy,20,FemaleJohn,22,Male```要提取第二列(age列)的数据,可以使用以下命令:```bashawk -F ',' '{print $2}' data.txt```输出结果如下:```age182022```在命令中,-F指定字段的分隔符为逗号(,),$2表示取第二个字段。
2. 根据条件提取数据我们可以使用awk命令根据条件提取文本文件中符合要求的数据。
假设我们有一个文本文件score.txt,内容如下:```name,scoreTom,80Amy,90John,75```要提取分数大于85的数据,可以使用以下命令:```bashawk -F ',' '$2 > 85 {print}' score.txt```输出结果如下:```name,scoreAmy,90```在命令中,$2 > 85表示第二列的值大于85时才执行打印操作。
Linuxawk命令详解awk是⼀个强⼤的⽂本分析⼯具,相对于grep的查找,sed的编辑,awk在其对数据分析并⽣成报告时,显得尤为强⼤。
简单来说awk就是把⽂件逐⾏的读⼊,以空格为默认分隔符将每⾏切⽚,切开的部分再进⾏各种分析处理。
使⽤⽅法: awk '{pattern + action}' {filenames}尽管操作可能会很复杂,但语法总是这样,其中 pattern 表⽰ AWK 在数据中查找的内容,⽽ action 是在找到匹配内容时所执⾏的⼀系列命令。
花括号({})不需要在程序中始终出现,但它们⽤于根据特定的模式对⼀系列指令进⾏分组。
pattern就是要表⽰的正则表达式,⽤斜杠括起来。
awk语⾔的最基本功能是在⽂件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进⾏其他⽂本操作。
完整的awk脚本通常⽤来格式化⽂本⽂件中的信息。
通常,awk是以⽂件的⼀⾏为处理单位的。
awk每接收⽂件的⼀⾏,然后执⾏相应的命令,来处理⽂本。
awk内置变量ARGC 命令⾏参数个数ARGV 命令⾏参数排列ENVIRON ⽀持队列中系统环境变量的使⽤FILENAME awk浏览的⽂件名FNR 浏览⽂件的记录数FS 设置输⼊域分隔符,等价于命令⾏ -F选项NF 浏览记录的域的个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符$0变量是指整条记录。
$1表⽰当前⾏的第⼀个域,$2表⽰当前⾏的第⼆个域,......以此类推。
$NF是number finally,表⽰最后⼀列的信息,跟变量NF是有区别的,变量NF统计的是每⾏列的总数常⽤的命令展⽰awk擅长列输出搜索/etc/passwd有root关键字的所有⾏awk '/root/' /etc/passwd 【这种是pattern的使⽤,匹配了pattern(这⾥是root)的⾏才会执⾏action(没有指定action,默认输出每⾏的内容)】搜索/etc/passwd有root关键字的所有⾏,并显⽰对应的shellawk -F: '/root/ {print $7}' /etc/passwd统计/etc/passwd:⽂件名,每⾏的⾏号,每⾏的列数,对应的完整⾏内容:awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd使⽤printf替代print,可以让代码更加简洁,易读awk -F: '{printf ("filename:%10s, linenumber:%3s,column:%3s,content:%3f\n",FILENAME,NR,NF,$0)}' /etc/passwd打印/etc/passwd/的第⼆⾏信息awk -F: 'NR==2{print "filename: "FILENAME, $0}' /etc/passwdawk的过滤使⽤⽅法ls -lF | awk '/^d/'指定特定的分隔符,查询第⼀列awk -F ":" '{print $1}' /etc/passwd指定特定的分隔符,查询最后⼀列awk -F ":" '{print $NF}' /etc/passwd指定特定的分隔符,查询倒数第⼆列awk -F ":" '{print $NF-1}' /etc/passwd获取第12到31⾏的第⼀列的信息awk -F ":" '{if(NR<31 && NR >12) print $1}' /etc/passwd多分隔符的使⽤:[root@localhost ftl]# awk -F "[/]" 'NR == 4 {print $0,"\n",$1}' /etc/passwd这⾥以/为分隔符,多个分隔符利⽤[]然后在⾥⾯写分隔符即可添加了BEGIN和END[root@localhost ftl]# cat /etc/passwd | awk -F: 'BEGIN{print "name, shell"} {print $1,$NF} END{print "hello world"}'查看最近登录最多的IP信息[root@localhost ftl]# last | awk '{S[$3]++} END{for(a in S ) {print S[a],a}}' |uniq| sort -rh利⽤正则过滤多个空格[root@localhost ~]# ifconfig |grep eth* | awk -F '[ ]+' '{print $1}'awk编程--变量和赋值除了awk的内置变量,awk还可以⾃定义变量, awk中的循环语句同样借鉴于C语⾔,⽀持while、do/while、for、break、continue,这些关键字的语义和C语⾔中的语义完全相同。
Linux命令高级技巧使用awk进行数据格式化和输出Linux命令高级技巧:使用awk进行数据格式化和输出在Linux系统中,awk是一种强大的文本处理工具,可用于数据提取、格式化、转换和输出。
本文将介绍使用awk进行数据格式化和输出的高级技巧。
一、awk的基本语法awk命令的基本语法如下:```bashawk 'pattern {action}' file```其中,pattern表示匹配条件,action表示要执行的操作,file表示要处理的文件。
当pattern匹配到文件的某一行时,就执行action中定义的操作。
二、数据格式化与输出1. 格式化输出字段awk可以对文件的字段进行格式化输出。
通过在action中使用printf 函数,可以指定输出的格式。
例如,下面的例子将以两位小数的形式输出文件的第二个字段:awk '{printf "%.2f\n", $2}' file```2. 自定义字段分隔符默认情况下,awk将空格作为字段的分隔符。
但是,你也可以通过设置变量FS来定义自己的字段分隔符。
例如,将逗号作为字段分隔符:```bashawk -F ',' '{print $1,$2}' file```3. 按照条件进行输出awk可以根据条件进行数据输出。
你可以使用if语句,通过判断条件决定是否输出符合条件的数据。
例如,下面的例子将输出第一个字段为"Apple"的行:```bashawk '$1=="Apple" {print $0}' file```4. 对数据进行统计和计算awk可以对文件中的数据进行统计和计算操作。
你可以定义变量,在action中通过对数据累加或者计算结果来实现统计。
例如,下面的例子统计文件中第二个字段的总和:awk '{sum+=$2} END{print sum}' file```5. 使用正则表达式匹配字段awk可以使用正则表达式来匹配字段,从而实现更为灵活的数据处理和输出。
在Linux中使用awk命令进行文本处理和数据提取在Linux系统中,awk是一种功能强大的文本处理工具,可用于从文件或输入流中提取和处理数据。
它提供了一种简单而有效的方式来搜索、过滤、处理和格式化文本数据。
本文将详细介绍如何在Linux中使用awk命令进行文本处理和数据提取。
一、awk命令的基本语法和工作原理awk命令的基本语法为:```shellawk 'pattern { action }' file```其中,pattern指定了一个模式,用于匹配输入数据的特定行;action指定了要执行的操作,用于处理匹配到的行。
file是输入文件的名称。
awk命令的工作原理如下:1. 从输入文件或输入流中逐行读取数据。
2. 对每一行数据,按照pattern进行模式匹配。
3. 如果匹配成功,则执行action。
4. 重复步骤2和步骤3,直到处理完所有的数据。
二、使用awk命令进行文本处理1. 文本分割awk可以根据指定的分隔符对文本进行分割。
以下是一个例子,假设有一个文本文件people.txt,内容如下:```shellJohn,Smith,25,MaleAlice,Johnson,30,Female```现在我们想要只输出每行的第一个字段(名字),可以使用以下命令:```shellawk -F ',' '{ print $1 }' people.txt```输出结果为:```JohnAlice```2. 文本过滤awk可以根据指定的条件对文本进行过滤。
以下是一个例子,假设有一个文本文件grades.txt,内容如下:```shellJohn,85Alice,95Tom,78Emma,92```现在我们想要只输出分数大于90的学生,可以使用以下命令:```shellawk -F ',' '$2 > 90 { print $1 }' grades.txt```输出结果为:```AliceEmma```3. 数值计算awk也支持对文本中的数值进行计算。
Linux命令高级技巧使用awk命令进行统计和计算在Linux操作系统中,awk命令是一种非常强大且灵活的文本处理工具。
它可以用于对文本文件进行数据提取、处理和分析。
在本文中,我们将介绍一些高级的awk命令技巧,重点是如何使用awk命令进行统计和计算。
一、awk命令简介awk是一种处理文本文件的命令行工具,在Linux系统中默认安装。
它以逐行扫描文本文件的方式工作,根据指定的规则来处理每一行的数据。
awk命令的语法通常为:```awk 'pattern {action}' file```其中,pattern用于匹配文本行,而action用于对匹配的行执行操作。
可以通过在pattern和action之间使用一些特殊的操作符和函数来实现更复杂的处理逻辑。
二、使用awk命令进行统计1. 行数统计使用awk命令可以轻松实现对文本文件行数的统计。
只需要将每一行视为一个记录,通过打印记录的数量即可得到行数。
具体命令如下:awk 'END{print NR}' file```其中,NR是awk内置的变量,表示当前记录(行)的数量。
使用END关键字可以确保在所有行处理完毕后才执行打印操作。
2. 字符数统计awk命令也可以用于统计文本文件中的字符数。
我们可以使用length函数来获取每一行的字符数,并将其累加得到总字符数。
具体命令如下:```awk '{count += length($0)} END{print count}' file```其中,$0表示当前行的内容,length函数用于计算当前行的字符数。
同样地,END关键字用于在所有行处理完毕后执行打印操作。
三、使用awk命令进行计算除了统计功能,awk命令还可以进行一些简单的数学计算。
我们可以使用awk的内置运算符和数学函数来实现。
1. 求和计算使用awk命令可以轻松实现对文本文件中数字列的求和计算。
假设要对某一列的数字进行求和,可以使用如下命令:awk '{sum += $1} END{print sum}' file```其中,$1表示当前行的第一个字段(列),sum是一个变量,用于累加每个字段的值。
linux awk正则表达式正则表达式是一种特殊的语法,用于匹配字符串。
在Linux下,正则表达式非常常用,它可以在grep、sed、awk等命令中使用。
本文将介绍正则表达式在awk命令中的使用方法。
awk是一种强大的文本处理工具,它可以用于分析和处理文件中的数据。
awk命令可以使用正则表达式对文件内容进行匹配,并对匹配到的字符串进行操作。
在awk命令中,正则表达式的语法非常简单,使用起来也非常方便。
下面介绍一些常用的正则表达式语法:1. 基本正则表达式在awk命令中,基本正则表达式采用的是POSIX标准的正则表达式语法。
基本正则表达式可以使用一些特殊字符来匹配文本中的字符串,比如 ^、$、.、*、+、?等。
• ^:匹配行首。
• $:匹配行尾。
• .:匹配任意一个字符。
• *:表示匹配零个或多个前面的字符。
• +:表示匹配一个或多个前面的字符。
• ?:表示匹配零个或一个前面的字符。
比如:awk '/^abc/' file.txt # 匹配以abc开头的行。
awk '/abc$/' file.txt # 匹配以abc结尾的行。
awk '/ab.c/' file.txt # 匹配ab后面跟着任意一个字符后跟着c的行。
awk '/ab*c/' file.txt # 匹配ab后面跟着零个或多个字符后跟着c 的行。
awk '/ab+c/' file.txt # 匹配ab后面跟着一个或多个字符后跟着c的行。
awk '/ab?c/' file.txt # 匹配ab后面跟着零个或一个字符后跟着c 的行。
2. 扩展正则表达式除了基本正则表达式外,awk命令还可以使用扩展正则表达式。
扩展正则表达式是基于POSIX标准的正则表达式语法的扩展版本。
在扩展正则表达式中,使用的特殊字符和基本正则表达式中的有所不同。
比如,扩展正则表达式可以使用 | 来表示或运算,可以使用 () 来分组匹配,可以使用 \{n,m\} 来匹配前面字符的重复次数等。
Linux Shell中awk命令的用法awk命令awk也是一个数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个字段来处理。
.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。
有三种方式调用awk1.命令行方式awk [-F field-separator] 'commands' input-files其中,[-F域分隔符]是可选的,因为awk使用空格或tab键作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项,如:awk -F: 'commands' input-file。
注:在linux系统中用环境变量IFS存储分隔符,但根据实际应用也可以改变IFS的值.例如:脚本执行结果如下:commands 是真正awk命令, input-files 是待处理的文件。
iput_files可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。
通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格或tab键。
2.shell脚本方式将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh可以换成:#!/bin/awk3.将所有的awk命令插入一个单独文件,然后调用:Awk -f awk-script-file input-files其中,-f选项加载awk-script-file中的awk脚本,input-files跟上面的是一样的。
awk的模式和动作任何awk语句都由模式和动作组成(awk_pattern { actions })。
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>。
linux常用命令awk的用法awk 是一个强大的文本处理工具,它能用来搜索、分析和抽取文本中的信息,是linux系统中常用的命令,也是编写shell脚本编程时必不可少的工具。
awk 命令根据用户指定的模式对文件内容进行分析处理,并将结果打印出来。
awk 命令通常包含三个部分:1、模式(Pattern)。
用于指定对文件的操作,比如当前行的字符数、格式是否正确等等。
2、动作(Action)。
指定在模式匹配时要采取的操作,比如打印出指定的字段,统计某些字段的总和,替换文字等等。
3、输入文件。
指定要被 awk 命令处理的文件,如果没有指定,则默认使用标准输入流 STDIN 。
AWK 的语法:awk [options] 'pattern {action}' file1 file2 …在上面的语法中,options 用于指定 awk 命令的运行参数,pattern 用于指定要匹配的文本模式,action 表示要对匹配的文本模式采取的操作,file1 file2 … 表示要被处理的文件,如果没有指定文件,则默认使用标准输入流 STDIN 。
AWK 的功能:1、AWK 可以根据输入行的模式自动地进行分类,并且可以把分类后的行写出到指定的文件中。
2、AWK 能够自动地将输入的数据分割成若干字段,并根据用户指定的Pattern 和 Action 对每一行进行处理。
3、AWK 提供了大量的内置函数,可以方便地操作字符串和数字。
4、AWK 能够利用用户自定义的函数进行更复杂的处理。
5、AWK 能够用来编写简单的程序来处理数据文件,而不需要编写C/C++ 程序。
AWK 的示例:1、统计某个文件中每行的字符数:awk '{print NR, " : ", length($0); }' filename上面的命令中,NR 表示当前行号,length($0) 表示当前行的字符数,filename 表示要处理的文件。
Linux命令:awk⼆.grep、sed、awk⽐较1.grep更适合单纯的查找或匹配⽂本2.sed更适合对匹配到的⽂本进⾏编辑3.命令awk更适合⽂本格式化,对⽂本进⾏较复杂的格式处理三.awk基本语法awk [options] 'pattern{action}' fileeg:vim test.txtABC 123 JackDEF 456 AliceGHI 789 Amy1.在没有options和pattern的情况下awk '{print}' test.txt//输出全⽂awk '{print $2}' test.txt//输出第⼆列awk '{print $2$1$3}' test.txt//调整第⼆列和第⼀列,并去掉中间的空格awk '{print $1,$2+1,$3}' test.txt//输出全⽂,第⼆列做+1计算2.pattern包括两种特殊模式,分别是BEGIN和END(1)BEGIN模式,是指命令在处理⽂本之前执⾏awk 'BEGIN{print "col1","col2","col3"}{print}' test.txtcol1 col2 col3ABC 123 JackDEF 456 AliceGHI 789 Amy(2)END模式,是指命令在处理⽂本之后执⾏awk '{print} END{print "end1","end2","end3"}' test.txtABC 123 JackDEF 456 AliceGHI 789 Amyend1 end2 end3(3)BEGIN和END同时存在时,其中,BEGIN和END之间的{}相当于⼀个循环体,对⽂件中的每⼀⾏进⾏处理awk 'BEGIN{print "col1","col2","col3"} {print} END{print "end1","end2","end3"}' test.txtcol1 col2 col3ABC 123 JackDEF 456 AliceGHI 789 Amyend1 end2 end33.常⽤的参数(1) -F,⽤于指定输⼊分隔符cp test.txt z.txtsed -i 's/查找字段/替换字段/g' filesed -i 's/ /:/g' z.txt//查找空格,⽤:替换cat z.txtABC:123:JackDEF:456:AliceGHI:789:Amyawk -F':' '{print $1,$2}' z.txt//以:分割awk -F' ' '{print $1,$2}' test.txt(2) -v,⽤于设置变量的值echo | awk -v v=100 '{print v}'echo | awk -v v1=1 -v v2=2 '{print v1,v2}'四.变量awk中变量分为内置变量和⾃定义变量两种1.内置变量FS 输⼊字段分隔符,默认为空⽩字符OFS 输出字段分隔符,默认为空⽩字符RS 输⼊记录分隔符(输⼊换⾏符),指定输⼊时的换⾏符ORS 输出记录分隔符(输出换⾏符),指定输出时的换⾏符NF 当前⾏的字段数(当前⾏被分隔符分割成了⼏段)NR 当前⾏的⾏号FNR 不同⽂件分别计数FILENAME 当前⽂件名ARGV 数组,保存的是命令⾏所给定的各参数ARGC ARGV数组的个数需要注意的是使⽤变量时,要使⽤-v选项指定对应的变量awk -v FS=':' -v OFS='#' '{print $1,$2}' z.txtABC#123DEF#456GHI#789awk -v FS=':' -v OFS='#' -v ORS='\n+++\n' '{print $1,$2}' z.txtABC#123+++DEF#456+++GHI#789+++awk -v RS='\n' '{print NR,$0}' test.txt//以\n为换⾏符,输出⾏号和每⾏内容1 ABC 123 Jack2 DEF 456 Alice3 GHI 789 AmyNF:当前⾏的字段数,其中$NF表⽰的是最后⼀个字段的内容,$(NF-1)表⽰的是倒数第⼆个字段的内容awk '{print NF,$0}' test.txt3 ABC 123 Jack3 DEF 456 Alice3 GHI 789 Amyawk '{print NF,$0,$1}' test.txt3 ABC 123 Jack ABC3 DEF 456 Alice DEF3 GHI 789 Amy GHIawk '{print NF,$NF,$0,$1}' test.txt3 Jack ABC 123 Jack ABC3 Alice DEF 456 Alice DEF3 Amy GHI 789 Amy GHINR:当前⾏号awk '{print NR,$0}' test.txt1 ABC 123 Jack2 DEF 456 Alice3 GHI 789 Amyawk '{print NR,$0,$NR}' test.txt1 ABC 123 Jack ABC2 DEF 456 Alice 4563 GHI 789 Amy Amywc -l test.txt //wc -l显⽰⾏数3 test.txtawk 'END{print NR}' test.txt3FNR:不同⽂件分别计数FILENAME:显⽰当前⽂件名awk '{print FNR,$0}' test.txt z.txt1 ABC 123 Jack2 DEF 456 Alice3 GHI 789 Amy1 ABC:123:Jack2 DEF:456:Alice3 GHI:789:Amyawk '{print FILENAME,FNR,$0}' test.txt z.txttest.txt 1 ABC 123 Jacktest.txt 2 DEF 456 Alicetest.txt 3 GHI 789 Amyz.txt 1 ABC:123:Jackz.txt 2 DEF:456:Alicez.txt 3 GHI:789:Amy2.⾃定义变量(1)使⽤-v来⾃定义变量(2)在awk中直接定义awk 'BEGIN{v=11;print v}'五.格式化中,awk使⽤printf时需要注意的问题1.使⽤printf输出的⽂本不会换⾏,使⽤'\n'转义换⾏2.使⽤printf输出时,指定的格式与被格式化的⽂本之间要⽤‘,’隔开3.使⽤printf输出时,格式中格式替换符必须与被格式化的⽂本⼀⼀对应awk '{printf "%.2f\n",$2}' test.txt123.00456.00789.00六.awk中的pattern模式当awk进⾏逐⾏处理时,会把pattern作为条件,判断当前⾏是否满⾜条件,若匹配则进⾏后⾯的处理,否则跳过该⾏。
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。
linux awk 分隔符
在Linux中,awk是常用的文本处理工具之一。
它的分隔符可以
使用任意字符,而不仅限于空格或TAB等常规分隔符。
在awk命令中,使用-F选项来指定分隔符。
下面是一个示例:
$ awk -F"," '{print $1}' data.txt
在这个例子中,我们使用逗号作为分隔符,并打印出data.txt
文件中的第一列数据。
除了单个字符分隔符,我们还可以使用多个字符作为分隔符。
在
这种情况下,我们使用双引号将多个字符括起来。
示例如下:$ awk -F"::" '{print $2}' data.txt
在这个例子中,我们使用两个冒号作为分隔符,并打印出
data.txt文件中的第二列数据。
总之,awk是一个十分强大的文本处理工具,可以用于各种编程
和文本数据处理任务。
熟练掌握它的分隔符用法可以极大地提高我们
的工作效率。
linux命令awk用法
awk是一种文本处理工具,用于从文件或标准输入中提取和处理数据。
它基于模式匹配和动作执行的原则。
一、awk命令的基本用法:
1.输出整行:
awk'{print}' file.txt
2.输出指定列:
awk'{print $1, $3}' file.txt
3.按特定分隔符输出列:
awk -F':''{print $1, $3}' file.txt
4.使用条件筛选:
awk'$3 > 10 {print}' file.txt
5.使用条件筛选并输出指定列:
awk'$3 > 10 {print $1, $3}' file.txt
6.使用自定义的动作进行处理:
awk'{sum += $3} END {print "总和:" sum}' file.txt
7.使用if-else条件:
awk '{if ($3 > 10) print"大于10"; else print"小于等于10"}'
file.txt
8.使用内置变量:
awk'{print NR, NF, $0}' file.txt
NR:当前记录号(行号);NF:当前记录的字段数;$0:整行内容
二、awk命令的高级用法:
awk 的高级用法包括更复杂的模式匹配、自定义函数、数组和循环等。
以下是一些常见的高级用法模式:
1.使用模式匹配:
awk'/pattern/ {print}' file.txt
输出文件中包含特定模式的所有行。
2.自定义函数:
awk'function myfunc(arg) {return arg * 2} {print myfunc($3)}'
file.txt
定义一个函数myfunc,并在每行的第三个字段上应用该函数进行处理。
3.使用数组:
awk'{arr[$1] += $2} END {for (key in arr) print key, arr[key]}'
file.txt
对文件中的第一个字段进行计数,并输出每个字段及其对应的计数结果。
4.循环结构:
awk'{for (i=1; i<=NF; i++) sum += $i} END {print "总和:"sum}'
file.txt
对当前行的每个字段进行求和,并在文件结束时输出总和。
5.使用正则表达式:
awk '/[0-9]+/ {print}' file.txt
输出包含一个或多个数字的行。
6.多个输入文件:
awk '{print FILENAME, $0}' file1.txt file2.txt
这里的FILENAME变量表示当前处理的文件名,通过结合$0(整行内容)一起输
出。
以上是awk的用法示例,希望对你有所帮助。