Loading... - `awk` 是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序 - `awk` 其实不仅仅是工具软件,还是一种编程语言。 了解 `awk` 和 `sed`,并用他们来做一些简单的数据修改操作。例如:求第三列的数字之和:`awk ‘{ x += $3 } END { print x }’`。这可能会比Python快 3 倍,并比 Python 的代码少三倍。 ## awk 基本用法 `$0`代表当前行,因此下命令的执行结果,就是把每一行原样打印出来。 ```sh awk 动作 文件名 awk '{print $0}' demo.txt echo 'this is a test' | awk '{print $0}' ``` 指定分隔符分隔符 awk 会根据空格和制表符,将每一行分成若干字段,依次用`$1`、`$2`、`$3`代表第一个字段、第二个字段、第三个字段等等。 ```sh echo 'this is a test' | awk '{print $3}' ``` 这个文件的字段分隔符是冒号(:),所以要用-F参数指定分隔符为冒号。然后,才能提取到它的第一个字段。 ```sh echo 'root:x:0:0:root:/root:/usr/bin/zsh' | awk -F ':' '{ print $1 }' awk -F ':' '{ print $1 }' demo.txt ``` 自定义输出内容 ```shell awk '{print "第一列",$1,"第二列",$2,"第五列",$5}' awk_test ``` 变量 `NF` 与 `$NF` 字段数与最后一个字段 ```shell echo 'this is a test' | awk '{print $NF}' ``` 倒数第二个字段 ```sh awk -F ':' '{print $1, $(NF-1)}' demo.txt ``` 打印行数 ```sh awk -F ':' '{print NR ") " $1}' demo.txt ``` `awk` 的其他内置变量如下。 ```shell FILENAME:当前文件名 FS:字段分隔符,默认是空格和制表符。 RS:行分隔符,用于分割每一行,默认是换行符。 OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。 ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。 OFMT:数字输出的格式,默认为%.6g。 ``` ## 函数 awk还提供了一些内置函数完整内置函数,方便对原始数据的处理。 ```bash echo 'this is a test' | awk '{print NR ")" toupper($0)}' ``` ```sh toupper()用于将字符转为大写 tolower():字符转为小写。 length():返回字符串长度。 substr():返回子字符串。 sin():正弦。 cos():余弦。 sqrt():平方根。 rand():随机数。 ``` ## 条件语句 awk允许指定输出条件,只输出符合条件的行。 print命令前面是一个正则表达式,只输出包含usr的行。 ```sh awk '条件 动作' 文件名 awk -F ':' '/usr/ {print $1}' demo.txt # 下面的例子只输出奇数行,以及输出第三行以后的行。 awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt awk -F ':' 'NR >3 {print $1}' demo.txt # 下面的例子输出第一个字段等于指定值的行。 awk -F ':' '$1 == "root" {print $1}' demo.txt awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt # if 语句, 放在 print 中 awk -F ':' '{if ($1 > "m") print $1}' demo.txt awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt ``` ## 变量说明 - `$0` 表示行,`$数字` 表示字段 - 变量`NF`表示当前行有多少个字段,因此`$NF`就代表最后一个字段。 - `$(NF-1)`代表倒数第二个字段。 - print命令里面的逗号,表示输出的时候,两个部分之间使用空格分隔。 - 上面代码中,print命令里面,如果原样输出字符,要放在双引号里面。 - awk 的命令必须在单引号内 ```bash echo 'this is a test' | awk '{print NF,$NF,NF-1,$(NF-1)} ``` 变量NR表示当前处理的是第几行。 ```bash echo 'this is a test' | awk '{print NR ")" $0}' # 1)this is a test ``` 最后修改:2022 年 01 月 18 日 06 : 28 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信