shell文本三剑客——3. awk

awk

    • 3.1 基础知识
    • 练习
      • 在前后放入name和end并输出第一列
      • 以bash开头或nologin为结尾的添加
      • 第7列是nologin的输出所有列
      • 返回列数和行数
      • 或 且
    • 3.2 awk脚本练习

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

3.1 基础知识

awk -F 分隔符:BEGIN{}{}END{} FILENAME
##默认不加F的情况下,分隔符为空格

NR       ## 返回行数
NF       ## 返回列数
FILENAME ## 文件名称本身
zx      ## dsd变量值
"zx"    ## dsd字符串

/bash$/               ## bash结尾的
/条件1|条件2/          ## 条件1或者条件2
/条件1/||/条件2/       ## 条件1或者条件2
/条件1/&&/条件2/       ## 条件1并且条件2

$0                    ## 所有的列
$1                    ## 第一列

练习

在前后放入name和end并输出第一列

awk -F : ‘BEGIN{print “name”}{print $1}END{print “end”}’ passwd

shell文本三剑客——3. awk_第1张图片

以bash开头或nologin为结尾的添加

awk -F : ‘BEGIN{print “name”}/bash / ∣ ∣ / n o l o g i n /||/nologin //nologin/{print $1}END{print “end”}’ passwd
在这里插入图片描述

第7列是nologin的输出所有列

awk -F : ‘BEGINP{print “name”}$7~/nologin/{print $1}END{print “end”}’ passwd
在这里插入图片描述

返回列数和行数

awk -F : ‘{print NF}’ passwd ## 分隔符为:,打印每行有多少列
awk ‘{print NR}’ passwd ## 默认分隔符为空格,打印行号
shell文本三剑客——3. awk_第2张图片
awk -F : ‘/bash$/{print NF}’ passwd ## 分隔符为:打印以bash结尾的行有多少列
在这里插入图片描述awk ‘/^root/{print}’ passwd ## 默认分隔符为空格,打印以root开头的行内容
在这里插入图片描述

awk ‘/bash$/{print FILENAME}’ passwd ## 以nologin结尾的行,有多少行就打印多少个FILENAME
shell文本三剑客——3. awk_第3张图片
awk ‘BEGIN{N=0}{N++}END{print N}’ passwd
##含义:N初始值为0,操作为N++,最后打印出N的值 passwd为查询的文件
在这里插入图片描述

或 且

awk -F : ‘/bash / ∣ ∣ / n o l o g i n /||/nologin //nologin/{print $1}’ /etc/passwd ## 两个条件,以bash或csh结果的

awk -F : ‘/bash ∣ n o l o g i n |nologin nologin/{print $1}’ /etc/passwd ## 一个条件

awk -F : ‘/^root/&&/bash$/{print $1}’ /etc/passwd ## 以 root开头并且以bash结尾的
shell文本三剑客——3. awk_第4张图片

awk -F : ‘KaTeX parse error: Expected 'EOF', got '&' at position 10: 6!~/home/&̲&/bash/{print}’ /etc/passwd ## 表示/etc/passwd文件第6列没有home关键字,并且以bash结尾的行
在这里插入图片描述

3.2 awk脚本练习

统计系统中能通过su切换的并且用户家目录不在/home下的用户数量

##查看能被su切换的用户名称类型
cat /etc/shells
##编辑shell脚本
#!/bin/bash
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&/bash$|sh$|csh$|tcsh$/{N++}END{print N}' /etc/passwd

在这里插入图片描述

你可能感兴趣的:(shell)