6.8 awk命令
-
awk:Linux 系统中一个功能更加强大的文本数据处理工具.和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。
-
awk 命令的基本格式为:
[root@CncLucZK ~]# awk [选项] '脚本命令' 文件名
-
此命令常用的选项以及各自的含义,如下表所示。
选项 含义 -F fs 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。 -f file 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令。 -v var=val 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。 -
awk 的强大之处在于脚本命令,它由 2 部分组成,分别为匹配规则和执行命令,如下所示:
'匹配规则{执行命令}'
-
这里的匹配规则,和 sed 命令中的 address 部分作用相同,用来指定脚本命令可以作用到文本内容中的具体行,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正则表达式指定。另外需要注意的是,整个脚本命令是用单引号(‘’)括起,而其中的执行命令部分需要用大括号({})括起来。在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。
-
例如:
[root@CncLucZK test]# cat demo2.txt
hello world!
123456abcdef
12345ABCDE
aaaaaaaaaa
sssssssssss
qqqqqqqqq
[root@CncLucZK test]# awk '/^$/{print "blank context"}' demo2.txt #打印demo2.txt中的空白行
blank context
blank context
blank context
blank context
blank context
blank context
blank context
blank context
在此命令中,
/^$/
是一个正则表达式,功能是匹配文本中的空白行,同时可以看到,执行命令使用的是 print 命令,此命令经常会使用,它的作用很简单,就是将指定的文本进行输出。因此,整个命令的功能是,如果 demo2.txt 有 N 个空白行,那么执行此命令会输出 N 个 Blank line。
6.8.1 awk 使用数据字段变量
-
awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据元素分配一个变量。默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:
- $0 代表整个文本行;
- $1 代表文本行中的第 1 个数据字段;
- $2 代表文本行中的第 2 个数据字段;
- $n 代表文本行中的第 n 个数据字段。
-
在 awk 中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。 在文本行中,每个数据字段都是通过字段分隔符划分的。awk 在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。
-
所以在下面的例子中,awk 程序读取文本文件,只显示第 1 个数据字段的值:
[root@CncLucZK test]# cat demo2.txt
hello world 1!
hello world 2!
hello world 3!
hello world 4!
hello world 5!
hello world 6!
12 345 ABCDE
aa aaa aaaaa
ss sss ssssss
qq qqq qqqq
#只显示第 1 个数据字段的值:
[root@CncLucZK test]# awk '{print $1}' demo2.txt
hello
hello
hello
hello
hello
hello
12
aa
ss
qq
#只显示第 3 个数据字段的值:
[root@CncLucZK test]# awk '{print $3}' demo2.txt
1!
2!
3!
4!
5!
6!
ABCDE
aaaaa
ssssss
qqqq
6.8.2 awk 脚本命令使用多个命令
- awk 允许将多条命令组合成一个正常的程序。要在命令行上的程序脚本中使用多条命令,只要在命令之间放个分号即可,例如:
[root@CncLucZK test]# awk '{$2="linux";print $0}' demo2.txt
hello linux 1!
hello linux 2!
hello linux 3!
hello linux 4!
hello linux 5!
hello linux 6!
12 linux ABCDE
aa linux aaaaa
ss linux ssssss
qq linux qqqq
#第一条命令会给字段变量 $1 赋值。第二条命令会打印整个数据字段。可以看到,awk 程序在输出中已经将原文本中的第1个数据字段替换成了新值。
[root@CncLucZK test]# echo "linux.is.easy.study"|awk -F . '{$1="shell";print $0}'
shell is easy study
- 也可以一次一行地输入程序脚本命令,比如说:
[root@CncLucZK test]# awk '{
$3="round";print $0}'
earth is square
earth is round
tony is square
tony is round
- 在你用了表示起始的单引号后,bash shell 会使用 > 来提示输入更多数据,我们可以每次在每行加一条命令,直到输入了结尾的单引号。
注意,此例中因为没有在命令行中指定文件名,awk 程序需要用户输入获得数据,因此当运行这个程序的时候,它会一直等着用户输入文本,此时如果要退出程序,只需按下 Ctrl+D 组合键即可。
6.8.3 awk从文件中读取程序
- 跟 sed 一样,awk 允许将脚本命令存储到文件中,然后再在命令行中引用,比如:
[root@CncLucZK test]# cat awk.sh
{$1="shell";print $0 "shell is so easy"}
[root@CncLucZK test]# awk -f awk.sh demo2.txt
shell world 1!shell is so easy
shell world 2!shell is so easy
shell world 3!shell is so easy
shell world 4!shell is so easy
shell world 5!shell is so easy
shell world 6!shell is so easy
shell 345 ABCDEshell is so easy
shell aaa aaaaashell is so easy
shell sss ssssssshell is so easy
shell qqq qqqqshell is so easy
- awk.sh 脚本文件先将demo2.txt 文件的第一个数据字段(字段变量 $1)置换,之后拼接一段字符串,最后使用 print 命令将整个文本内容打印出来。注意,在程序文件中,也可以指定多条命令,只要一条命令放一行即可,之间不需要用分号。
6.8.4 awk BEGIN关键字
- awk 中还可以指定脚本命令的运行时机。默认情况下,awk 会从输入中读取一行文本,然后针对该行的数据执行程序脚本,但有时可能需要在处理数据前运行一些脚本命令,这就需要使用 BEGIN 关键字。BEGIN 会强制 awk 在读取数据前执行该关键字后指定的脚本命令,例如:
[root@CncLucZK test]# awk 'BEGIN {print "demo2.txt context" } {
$3="round";print $0}' demo2.txt
demo2.txt context
hello world round
hello world round
hello world round
hello world round
hello world round
hello world round
12 345 round
aa aaa round
ss sss round
- 可以看到,这里的脚本命令中分为 2 部分,BEGIN 部分的脚本指令会在 awk 命令处理数据前运行,而真正用来处理数据的是第二段脚本命令。
6.8.5 awk END关键字
- 和 BEGIN 关键字相对应,END 关键字允许我们指定一些脚本命令,awk 会在读完数据后执行它们,例如:
[root@CncLucZK test]# awk 'BEGIN {print "demo2.txt context" } {
$3="round";print $0} END {print "end of txt!"}' demo2.txt
demo2.txt context
hello world round
hello world round
hello world round
hello world round
hello world round
hello world round
12 345 round
aa aaa round
ss sss round
qq qqq round
end of txt!
- 可以看到,当 awk 程序打印完文件内容后,才会执行 END 中的脚本命令。
6.9 nl 命令
-
nl 文件名:显示的时候,顺道输出行号!看代码行号
-
语法:
nl [-bnw] 文件
-
选项与参数:
- -b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值); - -n :列出行号表示的方法,主要有三种:
-n ln :行号在荧幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ; - -w :行号栏位的占用的位数。
- -b :指定行号指定的方式,主要有两种:
-
实例:
[root@CncLucZK test]# nl -n rn demo2.txt
1 hello world 1!
2 hello world 2!
3 hello world 3!
4 hello world 4!
5 hello world 5!
6 hello world 6!
[root@CncLucZK test]# nl -n ln demo2.txt
1 hello world 1!
2 hello world 2!
3 hello world 3!
4 hello world 4!
5 hello world 5!
6 hello world 6!
[root@CncLucZK test]# nl -n rz demo2.txt
000001 hello world 1!
000002 hello world 2!
000003 hello world 3!
000004 hello world 4!
000005 hello world 5!
000006 hello world 6!
参考文献:
Linux awk命令详解
下一篇:Linux学习-16-系统软件安装(RPM包安装、卸载和升级)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123776.html