Linux Shell 脚本编程学习之【第4章 awk命令最详细(第二部分)】

第4章 awk命令最详细 (第二部分)

  • 1 awk编程
    • 1.1 awk模式匹配
  • 2 awk编程示例
    • 2.1 第一种调用方式
    • 2.2 第二种调用方式
    • 2.3 第三种调用方式
    • 2.4 记录和域
    • 2.5 变量运算
    • 2.6 改变分隔符
  • 3 关系和布尔运算符
    • 3.1 匹配正则表达式~符号

1 awk编程

awk 是一种编程语言, gawk 是目前最新的版本,当前的 Linux 版本用的都是 gawk。
三种方式命令格式:
① 在 Shell 命令行输入命令调用 awk, 格式为:

awk [-F 域分隔符]awk 程序段:输入文件

② 将 awk 程序段插入脚本文件,然后通过awk 命令调用它,格式为:

awk  -f  awk脚本文件输入文件

③ 将 sed 命令插入脚本文件后,最常用的方法是设置该脚本文件为可执行,然后直接执行该脚本文件,格式为:

./awk 脚本文件输入文件

1.1 awk模式匹配

任何 awk 语句都由模式 (pattern)和动作 (action)组成。模式是一组用于测试输入行是 否需要执行动作的规则,动作是包含语句、函数和表达式的执行过程。

2 awk编程示例

2.1 第一种调用方式

awk 的第一种调用方式,单引号中间是 awk 命令,该awk 命令由两 部分组成,以/符号分隔,^KaTeX parse error: Expected group after '^' at position 67: …a blank line.”。^̲是正则表达式,表示空白行, print表示该动作是打印操作, test.log是输入文件名称。

[root@localhost 2023]# cat > test.log
12df3

df


dds
a
^C
[root@localhost 2023]# 
[root@localhost 2023]# 
[root@localhost 2023]# 
[root@localhost 2023]# awk '/^$/{print "This is a new line."}' test.log 
This is a new line.
This is a new line.
This is a new line.

2.2 第二种调用方式

[root@localhost 2023]# cat 1.awk 
/^$/{print "this is a new line."}
[root@localhost 2023]# awk -f 1.awk test.log 
this is a new line.
this is a new line.
this is a new line.
[root@localhost 2023]# 

2.3 第三种调用方式

// 可以直接调用脚本
[root@localhost 2023]# ./1.awk test.log 
this is a new line.
this is a new line.
this is a new line.
[root@localhost 2023]# cat 1.awk 
#!/bin/awk -f
/^$/{print "this is a new line."}
[root@localhost 2023]# chmod u+x 1.awk 
[root@localhost 2023]# ./1.awk test.log 
this is a new line.
this is a new line.
this is a new line.

2.4 记录和域

awk 认为输入文件是结构化的, awk 将每个输入文件行定义为记录,行中的每个字符串 定义为域,域之间用空格、 Tab 键或其他符号进行分隔,分隔域的符号叫做分隔符。
Linux Shell 脚本编程学习之【第4章 awk命令最详细(第二部分)】_第1张图片

[root@localhost 2023]# awk '{print ($3,$2,$1,$4)}' test.log 
column3 column2 column1 column4
sldf ddf 123 woem
xiezi kanbao dushu huahua
// $0 指打印全部列
[root@localhost 2023]# awk '{print ($0)}' test.log 
column1 column2 column3 column4
123 ddf sldf woem
dushu kanbao xiezi huahua
[root@localhost 2023]# 

2.5 变量运算

[root@localhost 2023]# awk 'BEGIN {ONE=1;TWO=2} {print $(ONE+TWO)}' test.log 
column3
sldf
xiezi
[root@localhost 2023]# 

2.6 改变分隔符

// 默认用空格分隔
[root@localhost 2023]# awk '{print ($3)}' test.log 
column3
sldf
xiezi
// 适用制表符分隔
[root@localhost 2023]# awk -F"\t" '{print ($3)}' test.log 
column4
woem
huahua

// 使用逗号做分隔符
[root@localhost 2023]# awk 'BEGIN {FS=","} {print $0}' test.log 
Li  Hao,njue,025-83481010
Zhang  Ju,nju,025-83466534
Wang Bin,seu,025-83494883
Zhu  Lin,njupt,025-83680010
[root@localhost 2023]# awk 'BEGIN {FS=","} {print $1,$3}' test.log 
Li  Hao 025-83481010
Zhang  Ju 025-83466534
Wang Bin 025-83494883
Zhu  Lin 025-83680010
[root@localhost 2023]# 

两个字符的分隔符

#下面是对FS 变量的两种赋值
(1)FS="\t"
(2)FS="\t+"
#下面是一条示例性记录
wza\t\tcq
--说明:第(1)FS 赋值将一个Tab 键作为分隔符,第(2)种以一个或多个Tab键作为分隔符,当解析下面这条示例性记录时,两种赋值将产生不同的结果。第(1)种将其解析为三个域: wza、 空域、 cq,(2)种将其解析为两个域: wza 和 cq。

3 关系和布尔运算符

运 算 符 意 义
< 小于
> 大于
<= 小于等于
>= 大于等于
== 等于
!= 不等于
~ 匹配正则表达式
!~ 不匹配正则表达式

3.1 匹配正则表达式~符号

[root@localhost 2023]# awk 'BEGIN {FS=":"} $1~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost 2023]# awk 'BEGIN {FS=":"} $0~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost 2023]# awk 'BEGIN {FS=":"} $0!~/nologin/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
rhel:x:1000:1000:rhel:/home/rhel:/bin/bash
db2inst1:x:1001:901::/home/db2inst1:/bin/bash
db2fenc1:x:1002:902::/home/db2fenc1:/bin/bash
db2as:x:1003:903::/home/db2as:/bin/bash
xj:x:808:809::/home/xj1:/bin/bash
[root@localhost 2023]# 
// awk命令利用if语句匹配第3域小于第4域的记录
[root@localhost 2023]# awk 'BEGIN {FS=":"} {if($3<$4) print $0}' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
xj:x:808:809::/home/xj1:/bin/bash
[root@localhost 2023]# 

你可能感兴趣的:(Shell,linux,学习,运维,awk)