awk 工具

21.1.3

扩展正则表达式

RE 字符 意义与范例
+ 意义:重复『一个或一个以上』的前一个 RE 字符 范例:搜寻 (god) (good) (goood)... 等等的字串。 那个 o+ 代表『一个以上的 o 』所以,底下的运行成果会将第 1, 9, 13 行列出来。egrep -n 'go+d' regular_express.txt
? 意义:『零个或一个』的前一个 RE 字符 范例:搜寻 (gd) (god) 这两个字串。 那个 o? 代表『空的或 1 个 o 』所以,上面的运行成果会将第 13, 14 行列出来。 有没有发现到,这两个案例( 'go+d' 与 'go?d' )的结果集合与 'go*d' 相同? 想想看,这是为什么喔! _egrep -n 'go?d' regular_express.txt
| 意义:用或( or )的方式找出数个字串 范例:搜寻 gd 或 good 这两个字串,注意,是『或』! 所以,第 1,9,14 这三行都可以被列印出来喔!那如果还想要找出 dog 呢?egrep -n 'gd|good' regular_express.txt egrep -n 'gd|good|dog' regular_express.txt
() 意义:找出『群组』字串 范例:搜寻 (glad) 或 (good) 这两个字串,因为 g 与 d 是重复的,所以, 我就可以将 la 与 oo 列于 ( ) 当中,并以 | 来分隔开来,就可以啦!egrep -n 'g(la|oo)d' regular_express.txt
()+ 意义:多个重复群组的判别 范例:将『AxyzxyzxyzxyzC』用 echo 叫出,然后再使用如下的方法搜寻一下!echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'上面的例子意思是说,我要找开头是 A 结尾是 C ,中间有一个以上的 "xyz" 字串的意思~

格式化打印:printf

[root@www ~]# printf '列印格式' 实际内容
选项与参数:
关于格式方面的几个特殊样式:
       a    警告声音输出
           倒退键(backspace)
       f    清除萤幕 (form feed)
       
    输出新的一行
       
    亦即 Enter 按键
       	    水平的 [tab] 按键
       v    垂直的 [tab] 按键
       xNN  NN 为两位数的数字,可以转换数字成为字节。
关于 C 程序语言内,常见的变量格式
       %ns   那个 n 是数字, s 代表 string ,亦即多少个字节;
       %ni   那个 n 是数字, i 代表 integer ,亦即多少整数码数;
       %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数码数,
             假设我共要十个位数,但小数点有两位,即为 %10.2f 罗!

awk:好用的数据处理工具

awk 处理流程:

  1. 读入第一行,并将第一行的数据填入 $0, $1, $2.... 等变量当中;
  2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
  3. 做完所有的动作与条件类型;
  4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。

awk 内建变量:

变量名称 代表意义
NF 每一行 ($0) 拥有的栏位总数
NR 目前 awk 所处理的是『第几行』数据
FS 目前的分隔字节,默认是空白键

例:

[root@www ~]# last -n 5| awk '{print $1 "	 lines: " NR "	 columns: " NF}'
root     lines: 1        columns: 10
root     lines: 2        columns: 10
root     lines: 3        columns: 10
dmtsai   lines: 4        columns: 10
root     lines: 5        columns: 9

# 注意喔,在 awk 内的 NR, NF 等变量要用大写,且不需要有钱字号 $ 啦!```
awk 逻辑运算字节:

awk 逻辑运算字节

运算单元 代表意义
> 大于
< 小于
>= 大于或等于
<= 小于或等于
== 等于
!= 不等于

例:

[root@www ~]# cat pay.txt |  > awk 'NR==1{printf "%10s %10s %10s %10s %10s
",$1,$2,$3,$4,"Total" } NR>=2{total = $2 + $3 + $4 printf "%10s %10d %10d %10d %10.2f
", $1, $2, $3, $4, total}'      Name        1st        2nd        3th      Total     VBird      23000      24000      25000   72000.00    DMTsai      21000      20000      23000   64000.00     Bird2      43000      42000      41000  126000.00
  • awk 的命令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个命令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键来隔开每个命令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!
  • 逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!
  • 格式化输出时,在 printf 的格式配置当中,务必加上 ,才能进行分行!
  • 与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。
原文地址:https://www.cnblogs.com/ananing/p/14225062.html