awk精讲
awk
其实不仅仅是工具软件,还是一种编程语言。
不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了
为什么学awk
什么是AWK
- 定义:AWK是一种用于文本处理的编程语言。它的名字来源于它的三位创始人Alfred Aho、Peter Weinberger和Brian Kernighan。
- 工作原理:AWK逐行读取输入文件(或标准输入),并将每行内容按照指定的分隔符(默认是空格或制表符)分割成多个字段。然后,它可以根据用户定义的规则对这些字段进行操作,如打印、计算、比较等。例如,对于文本文件“user.txt”内容如下:
当使用John 25 Male Mary 30 Female
awk '{print $1}' user.txt
命令时,$1
表示每行的第一个字段,该命令会输出“John”和“Mary”,这就是AWK提取和处理文本字段的基本方式。 - 主要组成部分:
- BEGIN块:在开始处理输入文件之前执行的代码块。通常用于初始化变量、设置全局参数等。例如,
awk 'BEGIN {FS=":"; print "开始处理文件"} {print $1}' /etc/passwd
,这里的BEGIN
块设置了字段分隔符FS
为:
,并打印了一个提示信息,然后再处理文件的每行第一个字段。 - 主输入循环(Pattern - Action):这是AWK的核心部分。
Pattern
是一个条件表达式,用于匹配输入行;Action
是在匹配成功后执行的操作。例如,awk '$3 > 20 {print $1}' user.txt
,这里$3 > 20
是模式,用于筛选第三列大于20的行,{print $1}
是动作,用于打印匹配行的第一列。 - END块:在处理完所有输入文件的行之后执行的代码块。可以用于输出总结信息等。例如,
awk '{count++} END {print "总行数为: ", count}' user.txt
,通过在主循环中计数,END
块输出文件的总行数。
- BEGIN块:在开始处理输入文件之前执行的代码块。通常用于初始化变量、设置全局参数等。例如,
为什么学AWK
- 强大的文本处理能力
- 日志分析:在服务器运维中,日志文件是至关重要的。例如,Web服务器日志(如Nginx的access.log)包含了大量的访问信息。AWK可以方便地提取出特定时间段内的访问记录、特定IP地址的访问次数、特定URL的访问情况等。假设要从Nginx日志中找出404错误的记录,可以使用
awk '$9 == "404" {print $0}' access.log
,其中$9
表示日志中的状态码字段,$0
表示整行记录。 - 配置文件管理:系统和应用程序的配置文件通常是文本格式。AWK可以用于修改配置文件或者提取关键配置信息。以Linux系统中的
/etc/hosts
文件为例,若要提取所有的主机名,可以使用awk '{print $2}' /etc/hosts
(假设主机名在每行的第二个字段)。
- 日志分析:在服务器运维中,日志文件是至关重要的。例如,Web服务器日志(如Nginx的access.log)包含了大量的访问信息。AWK可以方便地提取出特定时间段内的访问记录、特定IP地址的访问次数、特定URL的访问情况等。假设要从Nginx日志中找出404错误的记录,可以使用
- 与其他工具配合高效工作
- AWK可以和其他命令行工具(如
grep
、sed
)一起使用,在数据处理管道中发挥作用。例如,先用grep
筛选出包含特定关键词的行,然后用AWK对这些行进行进一步处理。假设有一个包含系统进程信息的文件process.txt
,先使用grep
找出包含“httpd”的行,再用AWK提取每行的进程ID(假设进程ID在第二列),可以这样操作:grep "httpd" process.txt | awk '{print $2}'
。
- AWK可以和其他命令行工具(如
- 自动化和脚本编写
- 在编写运维脚本时,AWK可以作为一个关键的组件。例如,编写一个脚本来定期检查服务器的资源使用情况,并根据预设的阈值发送警报。可以使用AWK来处理系统命令(如
top
、free
等)输出的文本信息,判断资源使用是否超过阈值,然后触发相应的报警机制。
- 在编写运维脚本时,AWK可以作为一个关键的组件。例如,编写一个脚本来定期检查服务器的资源使用情况,并根据预设的阈值发送警报。可以使用AWK来处理系统命令(如
- 强大的文本处理能力
怎么学AWK
- 基础语法学习
- 学习字段和变量:了解如何通过
$
符号来引用字段(如$1
表示第一个字段,$0
表示整行),以及如何定义和使用变量。例如,awk '{sum += $2; count++} END {print "平均值为: ", sum/count}' data.txt
,这里定义了变量sum
用于求和,count
用于计数,最后在END
块计算并输出平均值。 - 掌握模式匹配:学习如何使用比较运算符(如
==
、>
、<
)、正则表达式来匹配行。例如,awk '/^[0-9]/ {print $0}' file.txt
会打印以数字开头的行。 - 熟悉动作操作:包括打印(
print
)、赋值、控制流语句(如if - else
)等。例如,awk '{if ($3 > 50) print $1, "得分高"; else print $1, "得分低"}' score.txt
。
- 学习字段和变量:了解如何通过
- 实践操作
- 处理实际文本文件:找一些实际的文本文件来练习,如系统日志、配置文件、数据报表等。例如,从系统的
/var/log/messages
日志文件中提取出包含“error”的行,并统计其出现的次数。 - 编写简单脚本:结合Shell脚本,用AWK编写一些简单的自动化脚本。比如编写一个脚本,用于备份配置文件,并在备份文件中添加备份日期(可以使用AWK来修改备份文件的内容,添加日期字段)。
- 处理实际文本文件:找一些实际的文本文件来练习,如系统日志、配置文件、数据报表等。例如,从系统的
- 参考书籍和在线资源
- 书籍:《The AWK Programming Language》是AWK创始人编写的权威书籍,详细介绍了AWK的语法和应用。
- 在线资源:像Linux Documentation Project(LDP)等网站有很多关于AWK的教程和示例。同时,Stack Overflow也是一个很好的地方,可以在遇到问题时查找解决方案或者提问。
- 基础语法学习
awk是什么
awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式。
awk早期在Unix上实现,我们用的awk是gawk,是GUN awk的意思
awk更是是一门编程语言,支持条件判断、数组、循环等功能
- awk以正则表达式(模式)来扫描、处理文本数据
awk 不仅仅是 linux 系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel)
处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过关单获取标准输入
awk 可以在命令行上直接编辑命令进行操作,也可以编写成 awk 程序(脚本文件)来进行更为复杂的运行
本章主要讲解 awk 命令行的直接使用。
再谈三剑客
- grep,擅长单纯的查找或匹配文本内容
- sed,更适合编辑、处理匹配到的文本内容
- awk,更适合格式化文本内容,对文本进行复杂处理后、更友好的显示
三个命令称之为Linux的三剑客
awk学完后的能力
以下部分内容需要结合shell编程
- 对文本行数据提取数据字段
- 模式、动作
- 正则模式匹配
- 匹配到数据后的动作
- awk执行流程
- awk内置变量(默认预留变量)
- awk数组
- awk循环、条件判断
- awk内置函数
- awk参数传递
- awk程序开发
awk运行环境
本章讲解的awk来自于GNU/Linux提供的gawk,也就是说awk还有其他版本,暂且忽略。
[242-yuchao-class01 root ~]#cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[242-yuchao-class01 root ~]#uname -r
3.10.0-862.el7.x86_64
[242-yuchao-class01 root ~]#ll `which awk`
lrwxrwxrwx. 1 root root 4 Feb 25 18:52 /usr/bin/awk -> gawk
[242-yuchao-class01 root ~]#ll `which gawk`
-rwxr-xr-x. 1 root root 428584 Jun 29 2017 /usr/bin/gawk
awk的语法格式
awk 指令是由模式,动作,或者模式和动作的组合
组成.
模式即 pattern,可以类似理解成 sed 的模式匹配,可以由表达式组成,也可以使两个正斜杠之间的正则表 达式.比如 NR==1,这就是模式,可以把他理解为一个条件.
动作即 action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开,如下 awk 使用格式
- Action指的是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是
print
awk模式动作
生成测试数据
[242-yuchao-class01 root ~]#echo cc{01..50} | xargs -n 5
cc01 cc02 cc03 cc04 cc05
cc06 cc07 cc08 cc09 cc10
cc11 cc12 cc13 cc14 cc15
cc16 cc17 cc18 cc19 cc20
cc21 cc22 cc23 cc24 cc25
cc26 cc27 cc28 cc29 cc30
cc31 cc32 cc33 cc34 cc35
cc36 cc37 cc38 cc39 cc40
cc41 cc42 cc43 cc44 cc45
cc46 cc47 cc48 cc49 cc50
写入文件
echo cc{01..50} | xargs -n 5 > yuchao.log
初体验awk,提取第一列数据,仅使用打印动作
[242-yuchao-class01 root ~]#awk '{print $1}' yuchao.log
cc01
cc06
cc11
cc16
cc21
cc26
cc31
cc36
cc41
cc46
加上模式、和动作,比如指定行号
NR>=2&&NR<=5 是awk的模式,NR也是内置变量,
[242-yuchao-class01 root ~]#awk 'NR>=2&&NR<=5{print $0}' yuchao.log
cc06 cc07 cc08 cc09 cc10
cc11 cc12 cc13 cc14 cc15
cc16 cc17 cc18 cc19 cc20
cc21 cc22 cc23 cc24 cc25
以及指定打印某个字段的数据,如$3
[242-yuchao-class01 root ~]#awk 'NR>=2&&NR<=5{print $3}' yuchao.log
cc08
cc13
cc18
cc23
限定模式、打印动作、以及显示对应行号
[242-yuchao-class01 root ~]#awk 'NR>=2{print $0,NR}' yuchao.log
cc06 cc07 cc08 cc09 cc10 2
cc11 cc12 cc13 cc14 cc15 3
cc16 cc17 cc18 cc19 cc20 4
cc21 cc22 cc23 cc24 cc25 5
cc26 cc27 cc28 cc29 cc30 6
cc31 cc32 cc33 cc34 cc35 7
cc36 cc37 cc38 cc39 cc40 8
cc41 cc42 cc43 cc44 cc45 9
cc46 cc47 cc48 cc49 cc50 10
图解模式、动作
只有模式
awk不指定动作的话,默认打印整行信息
[242-yuchao-class01 root ~]#awk 'NR>=2&&NR<=6' yuchao.log
cc06 cc07 cc08 cc09 cc10
cc11 cc12 cc13 cc14 cc15
cc16 cc17 cc18 cc19 cc20
cc21 cc22 cc23 cc24 cc25
cc26 cc27 cc28 cc29 cc30
只有动作
没有模式,也就是没限定条件,
Awk默认处理所有行
[242-yuchao-class01 root ~]#awk '{print $1,$2}' yuchao.log
cc01 cc02
cc06 cc07
cc11 cc12
cc16 cc17
cc21 cc22
cc26 cc27
cc31 cc32
cc36 cc37
cc41 cc42
cc46 cc47
多个模式和动作
- 指定行,
NR==4
,number of record,行号的记录 - 指定动作,
print $0,NF,NR
- 内置变量$0表示整行数据
- NF表示Number of filed,字段的数量,表示这一行数据分了几列
- NR表示,number of record,行号的记录,表示在处理第几行
[242-yuchao-class01 root ~]#awk 'NR==4{print $0,NF,NR}' yuchao.log
cc16 cc17 cc18 cc19 cc20 5 4
小结
- pattern和action都要用单引号,防止shell作特殊解释(是交给awk去执行的,而不是bash)
- 不指定模式,awk默认处理输入的文件数据,每一行,每一列
- 如果指定模式,例如指定的行,awk就处理指定那一行的数据
- awk的动作,必须写在花括号里
{print}
,括号里写入awk提供的命令。- 如果没有
{ }
花括号,就会被识别为patter,而不是action
- 如果没有
- 注意给awk传入数据,一般都是file
图解awk执行过程
awk的字段(列)、记录(行)
awk变量符号 | 作用 | 名称翻译 |
---|---|---|
NR | 行记录、行数据、awk处理的第几行 | umber of record |
NF | 字段的数量,表示这一行数据分了几列, | Number of filed, |
$1 | 第一个字段的数据、$2、$3以此类推 | |
awk如何处理行
[242-yuchao-class01 root ~]#cat yuchao.log
cc01 cc02 cc03 cc04 cc05
cc06 cc07 cc08 cc09 cc10
cc11 cc12 cc13 cc14 cc15
cc16 cc17 cc18 cc19 cc20
cc21 cc22 cc23 cc24 cc25
cc26 cc27 cc28 cc29 cc30
cc31 cc32 cc33 cc34 cc35
cc36 cc37 cc38 cc39 cc40
cc41 cc42 cc43 cc44 cc45
cc46 cc47 cc48 cc49 cc50
awk其他内置变量
变量名 | 描述 |
---|---|
$0 |
表示整个当前行的内容。例如,在处理文本文件时,$0 会包含每一行的全部文本。如果文件内容是“apple banana cherry”,那么在处理每一行时,$0 就是“apple banana cherry”。 |
$n (n 为正整数) |
代表当前行中的第n 个字段。字段是由分隔符划分的部分。默认分隔符是空格或制表符。比如一行内容是“one two three”,$1 就是“one”,$2 是“two”,$3 是“three”。 |
NF (Number of Fields) |
记录当前行的字段数量。假设一行内容是“a b c d”,那么NF 的值就是4。这在需要知道每行有多少个部分时非常有用,比如可以用于检查数据格式是否符合预期。 |
NR (Number of Rows) |
表示已经读取的行数。从1开始计数,每读取一行,NR 的值就加1。当处理文件的第二行时,NR 的值为2。这个变量常用来跟踪处理进度或者作为行号进行引用。 |
FNR (File Number of Rows) |
和NR 类似,不过在处理多个文件时,FNR 在每个文件中都是从1开始计数。例如,同时处理文件A和文件B,当开始处理文件B时,FNR 会重新从1开始,而NR 会继续累加,这样可以方便地区分是在哪个文件中的行号。 |
FS (Field Separator) |
用于定义输入字段的分隔符。默认是空格或制表符,但可以修改。比如,如果想以逗号作为分隔符,可以在awk 脚本开头设置FS="," ,这样在处理数据“a,b,c”时,$1 就是“a”,$2 是“b”,$3 是“c”。 |
OFS (Output Field Separator) |
用于定义输出字段的分隔符。例如,设置OFS=" - " 后,当输出两个字段$1 和$2 时,它们之间会用“ - ”分隔。如果$1 是“apple”,$2 是“banana”,输出可能就是“apple - banana”。 |
RS (Record Separator) |
定义输入记录(行)的分隔符。默认是换行符。但如果将RS 设置为其他字符,比如“@”,那么文本中遇到“@”就会被认为是新行的开始。 |
ORS (Output Record Separator) |
定义输出记录(行)的分隔符。默认是换行符。如果将ORS 设置为“###”,那么输出的每一行之间会用“###”分隔。 |
参考国外awk网址
awk的其他内置变量如下。
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
Input field separator variable.输入字段分隔符变量。
RS:行分隔符,用于分割每一行,默认是换行符。
Record Separator variable,行分隔符变量
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
Output Field Separator Variable,输出字段分隔符变量
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
Output Record Separator Variable,输出记录分隔符变量
OFMT:数字输出的格式,默认为%.6g。
RS变量/ORS变量
OFS变量:Output Field Separator Variable,输出字段分隔符变量
RS变量: record separator,记录分隔符
图解awk执行的输入、输出
awk 对每个要处理的输入数据认为都是具有格式和结构的,而不仅仅是一堆字符串
默认情况下,每一行 内容都是一条记录,并以换行符分隔(\n)结束
- awk默认下,每一行就是每一个record(记录)
- RS 即 record separator 输入输入数据 ,表示每个记录输入的时候分隔符.即行与行之间如何分隔.
- NR 即 number of record 记录(行)号,表示当前正在处理的记录(行)的号码
- ORS 即 output record separator 输出记录分隔符
修改RS/修改awk输入显示
[242-yuchao-class01 root ~]#head -3 yuchao.log
cc01 cc02 cc03 cc04 cc05
cc06 cc07 cc08 cc09 cc10
cc11 cc12 cc13 cc14 cc15
[242-yuchao-class01 root ~]#
[242-yuchao-class01 root ~]#
[242-yuchao-class01 root ~]#head -3 yuchao.log | awk -v RS=' ' '{print $0,NR}'
cc01 1
cc02 2
cc03 3
cc04 4
cc05
cc06 5
cc07 6
cc08 7
cc09 8
cc10
cc11 9
cc12 10
cc13 11
cc14 12
cc15
13
修改ORS/修改awk输出显示
你可以自由修改,awk处理完毕后的每一行的分隔符,也就是修改ORS变量。
小结
- awk默认情况下,认为文件从头到尾是一整行数据,直到碰见换行符
\n 回车换行符
,因此本行结束,进入下一行- 可以通过修改awk的RS变量,修改行输入的分隔符
面试题,统计单词出现频率
I have a dog, it is lovely, it is called Mimi. Every time I go home from school, Mimi always cruising around me, I will go to the kitchen to get a piece of meat to it, it lay on the floor to eat. My legs and then jump to bark "Wang "called, so I picked up Mimi, it is the opportunity to lick my hand, making me laugh.I like Mimi, like puppies.
代码思路
- 先让所有单词合并为1列,注意是一列、排成一队、然后排序,合并重复的,且统计重复次数
1.sed解决
[242-yuchao-class01 root ~]#sed -r 's#\s#\n#g' english.txt | sort -n | uniq -c | sort -nr
2. tr命令解决 tr 用于字符串替换 tr old_str1 new_str2
整体思路和sed一样
[242-yuchao-class01 root ~]#tr ' ' '\n' < english.txt | sort -n | uniq -c | sort -nr
3.grep处理
[242-yuchao-class01 root ~]#grep -E '[a-zA-Z]+' english.txt -o | sort -n | uniq -c | sort -nr
4.awk处理,修改数据的输入行分割符号,RS修改为,除了英文字母以外的任意符号,视为换行
[242-yuchao-class01 root ~]#awk -v RS='[^a-zA-Z]+' '{print $0}' english.txt | sort -n | uniq -c | sort -nr
行记录$0
在 awk 中,$0 表示整行,其 awk 使用$0 来表示整行数据。
字段记录$1、$2、$3
awk默认根据空格和制表符,将每一行数据分割为若干个字段,依次用$1
、$2
、$3
代表第一个字段、第二个字段、第三个字段等等。
[242-yuchao-class01 root ~]#echo 'this is chaoge linux' | awk '{print $3}'
chaoge
NR 记录号、行号
$0表示整行的数据
NR 表示记录号、也就是行号
awk添加文本行号
[242-yuchao-class01 root ~]#awk '{print NR,$0}' yuchao.log
1 cc01 cc02 cc03 cc04 cc05
2 cc06 cc07 cc08 cc09 cc10
3 cc11 cc12 cc13 cc14 cc15
4 cc16 cc17 cc18 cc19 cc20
5 cc21 cc22 cc23 cc24 cc25
6 cc26 cc27 cc28 cc29 cc30
7 cc31 cc32 cc33 cc34 cc35
8 cc36 cc37 cc38 cc39 cc40
9 cc41 cc42 cc43 cc44 cc45
10 cc46 cc47 cc48 cc49 cc50
小结
- NR(number of recprd)存放着每个记录的号(行号)读取新行时候会自动+1
- RS(record separator)是输入数据的记录的分隔符
- 简单理解就是可以指定每个记录的结尾标志
- 修改RS就是在指定一行记录的结束
- 当修改了RS变量,最好配合NR变量查看变化,查看每一行是否生成了
- 可以修改ORS变量,修改awk的最终打印结果,每一行的输出格式,默认是换行,你可以改成其他的。
字段(列)
每条记录都是由多个区域(field)组成的
默认情况下区域之间的分隔符是由空格(即空格或制表符)来分隔
将分隔符记录在内置变量 FS中
每行记录的区域数据保存在 awk 的内置变量 NF 中
图解awk字段
- FS 即 fileld separator,输入字段(列)分隔符,分隔符就是菜刀,把一行字符串切为很多区域
- NF 即 number of fileds,表示一行中列(字段)的个数,可以理解为菜刀切过一行后,切成了多少份
指定分隔符
当文本不是以空格分割,你得自己找特征,进行切蛋糕。
- FS的值可以是固定的字符、也可以是正则表达式
例如/etc/passwd文件 ,提取用户信息
FS变量的bug(gawk的bug)
问题原因
FS=":"
写在动作块内部的问题:- 在
awk
中,如果FS
被定义在动作块{}
内,分隔符的设置可能不会立即生效,而是作用于下一行。这是由于awk
在读取第一行时,已经使用了默认分隔符(空格或制表符)进行解析,而新设置的FS=":"
未能在处理当前行时生效。 - 表现:
第一行仍然用默认分隔符解析,导致
print $1,$2,$3,$4
输出整个行作为$1
,其他字段为空。
- 在
后续行为什么正常:
- 在第一行之后,
FS=":"
已经生效,awk
能正确按照冒号分隔每一行,因此其余行看起来是正确的结果。
- 在第一行之后,
不同版本
awk
的行为差异:- 某些
awk
实现(如 GNU awk,简称gawk
)会忽略这种时机问题,而其他版本可能严格按照分隔符设置的时序处理。
- 某些
解决方法
为了避免 FS
的设置时机影响行为,正确的做法是将 FS=":"
放到 BEGIN
块 或使用 命令行选项 -F
指定。
方法 1:在 BEGIN
块中设置
awk 'BEGIN {FS=":"} {print $1,$2,$3,$4,NR}' /etc/passwd
方法 2:使用命令行参数 -F
awk -F: '{print $1,$2,$3,$4,NR}' /etc/passwd
\
方法3:用-v参数
awk -v FS=':' '{print $1,$2}' /etc/passwd
答案
第一行出错是因为 FS=":"
被定义在动作块中,导致分隔符的设置无法立即生效。为避免类似问题,可以将 FS=":"
放到 BEGIN
块中,或使用 -F
明确指定分隔符。
提取用户名、登录解释器
awk -F 参数,后面跟着的是指定的分隔符
[yuchao-tx-server root ~]#awk -F ':' '{print $1,$NF}' /etc/passwd | column -t
提取用户账号密码信息
生成测试数据,python脚本
import random
import csv
# CSV 文件路径
file_path = 'user_id.csv'
# 打开文件并初始化写入
with open(file_path, 'w', newline='') as f:
writer = csv.writer(f)
# 循环生成数据
for i in range(1, 101):
# 生成随机用户名、密码和身份证号
username = f'test{i}'
password = '123456'
ID = random.randint(100000000000000000, 999999999999999999)
# 写入一行数据
writer.writerow([username, password, ID])
awk用来提取此类数据是最合适且方便的了。
提取前10位用户的数据
[yuchao-tx-server root ~]#awk 'NR<=10{print $0}' user_id.csv
test1,123456,270241396203635909
test2,123456,130151351475223964
test3,123456,864152877321327833
test4,123456,411585875542697231
test5,123456,510201954047003181
test6,123456,316681826889452945
test7,123456,735133350806256761
test8,123456,737257402318119726
test9,123456,598126653502814276
test10,123456,438232474130569993
提取30号用户的用户名、身份证号
[yuchao-tx-server root ~]#awk -F ',' '/test30/{print $1,$3}' user_id.csv
test30 780364619364745629
提取ip地址
[yuchao-tx-server root ~]#ifconfig eth0| awk 'NR==2{print $2}'
10.141.32.137
修改FS和OFS变量
刚才我们练习了
RS和ORS
- RS、输入记录分隔符,决定awk如何分隔每一行(默认是\n)
- ORS,输出记录分隔符,决定awk如何输出每一行(默认是\n)
FS和OFS
- FS是输入字段分隔符,决定awk输入数据后的每一个字段分隔符是什么,默认是空格
- OFS是输出字段分隔符,决定awk输出每个字段的分隔符是什么,默认是空格
指定FS分隔符(在哪个位置切蛋糕)
两个方式
1、参数
awk -F '分隔符'
2.修改变量
awk -v FS='分隔符'
执行OFS分隔符(切完后的字段分隔符)
两个方式
1、参数
awk -F '分隔符'
2.修改变量
awk -v FS='分隔符'
案例
修改每一个字段之间的分隔符为#
[yuchao-tx-server root ~]#awk -v OFS='#' '{print $1,$2,$3,$4,$5}' chaoge.log
cc01#cc02#cc03#cc04#cc05
cc06#cc07#cc08#cc09#cc10
cc11#cc12#cc13#cc14#cc15
cc16#cc17#cc18#cc19#cc20
cc21#cc22#cc23#cc24#cc25
cc26#cc27#cc28#cc29#cc30
cc31#cc32#cc33#cc34#cc35
cc36#cc37#cc38#cc39#cc40
cc41#cc42#cc43#cc44#cc45
cc46#cc47#cc48#cc49#cc50
改造/etc/passwd格式
1.读取文件数据(注意提取分隔符规律)
[yuchao-tx-server root ~]#head -5 /etc/passwd | awk -F ':' '{print $1,$2,$3,$4,$5,$6,$7}'
2.修改格式化后的数据
head -5 /etc/passwd | awk -F ':' -v OFS='---' '{print $1,$2,$3,$4,$5,$6,$7}'
图解修改FS、OFS
总结行、列
- RS、ORS、代表了awk的输入、输出、关于行的分隔符
- FS、OFS、代表了awk的输入、输出、关于列的分隔符
- 对于不同的文本,需要选择合适的FS、合适的菜刀,来分割出左右可以便于提取的数据
- NR表示行号、记录号
- NF表示每一行的字段数、有多少列
- $符号一般用于提取某一列的数据,如$1、$2
- $NF表示最后一列的数据
关于awk基础快速入门总结
- awk的命令行、语法结构
- awk的模式、动作
- awk的行、列
- awk的列、也就是字段是核心需要提取的某一块数据。