千家信息网

shell编程之正则表达式(三)awk工具

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,awk 工具在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当
千家信息网最后更新 2024年11月20日shell编程之正则表达式(三)awk工具

awk 工具
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
awk 常见用法
通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号"{}"用于设置对数据进行的处理动作。awk 可以直接处理目标文件,也可以通过"-f"读取脚本对目标文件进行处理。
awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 " //过滤并输出文件符条件的内容awk -f 脚本文件 文件 1 文件 2 " //从脚本中调用编辑指令,过滤并输出内容。前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个"字段"然后再进行处理,且默认情况下字段的分隔符为空格或者 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。在使用 awk 命令的过程中,可以使用逻辑操作符"&&",表示"与", "||"表示"或","!"表示"非";还可以进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方。
在 Linux 系统中/etc/passwd 是一个非常典型的格式化文件,各字段间使用":"作为分隔符隔开,Linux 系统中的大部分日志文件也是格式化文件,从这些文件中提取相关信息
是运维的日常工作内容之一。若需要查找出/etc/passwd 的用户名、用户 ID、组 ID 等列, 执行以下 awk 命令即可。

[root@localhost ~]# awk -F ':' '{print $1,$3,$4}' /etc/passwd

awk 从输入文件或者标准输入中读入信息,与 sed 一样,信息的读入也是逐行读取的。不同的是 awk 将文本文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。为了操作这些不同的字段,awk 借用 shell 中类似于位置变量的方法, 用$1、$2、$3"顺序地表示行(记录)中的不同字段。另外 awk 用$0 表示整个行(记录)。不同的字段之间是通过指定的字符分隔。awk 默认的分隔符是空格。awk 允许在命令行中用"-F 分隔符"的形式来指定分隔符。
awk 包含几个特殊的内建变量(可直接用)如下所示:

  • FS:指定每行文本的字段分隔符,默认为空格或制表位(tab)。
  • NF:当前处理的行的字段个数。
  • NR:当前处理的行的行号(序数)。
  • $0:当前处理的行的整行内容。
  • $n:当前处理行的第 n 个字段(第 n 列)。
  • FILENAME:被处理的文件名。
    RS:数据记录分隔,默认为\n,即每行为一条记录。
    用法示例
    awk    '{print}' test.txt//输出所有内容,等同于 cat test.txtawk '{print $0}' test.txt //输出所有内容,等同于 cat test.txt

    awk 'NR==1,NR==3{print}' test.txt   awk '(NR>=1)&&(NR<=3){print}' test.txt输出第 1~3 行内容

    awk 'NR==1||NR==3{print}' test.txt  #输出第 1 行、第 3 行内容

    awk '(NR%2)==1{print}' test.txt #输出所有奇数行的内容

    awk '(NR%2)==0{print}' test.txt #输出所有偶数行的内容

    awk '/^root/{print}' /etc/passwd    #输出以root 开头的行

    awk '/nologin$/{print}' /etc/passwd输出以 nologin 结尾的行

    awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END {print x}' /etc/passwd#统计以/bin/bash 结尾的行数,等同于: grep -c "/bin/bash$" /etc/passwd 

    awk 'BEGIN{RS=""};END{print NR}' /etc/squid/squid.conf#统计以空行分隔的文本段落数

    按字段输出文本

    awk '{print $3}' test.txt   #输出每行中(以空格或制表位分隔)的第 3 个字段awk '{print $1,$3}' test.txt    #输出每行中的第 1、3 个字段awk -F ":" '$2==""{print}' /etc/shadow #输出密码为空的用户的shadow 记录awk 'BEGIN {FS=":"}; $2==""{print}' /etc/shadow//输出密码为空的用户的shadow 记录awk -F ":" '$7~"/bash"{print $1}' /etc/passwd//输出以冒号分隔且第 7 个字段中包含/bash 的行的第 1 个字段awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services//输出包含 8 个字段且第 1 个字段中包含 nfs 的行的第 1、2 个字段awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd//输出第 7 个字段既不为/bin/bash 也不为/sbin/nologin 的所有行

    0通过管道、双引号调用 Shell 命令

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd#调用wc -l 命令统计使用bash 的用户个数,等同于 grep -c "bash$" /etc/passwd awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'#调用w 命令,并用来统计在线用户数awk 'BEGIN { "hostname" | getline ; print $0}'#调用hostname,并输出当前的主机名

sort 工具
在 Linux 系统中,常用的文件排序工具有三种:sort、uniq、wc 。本章将介绍前两种工具的用法。
sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的牌局就不一样。sort 命令的语法为"sort [选项] 参数",其中常用的选项包括以下几种。

  • -f:忽略大小写;
  • -b:忽略每行前面的空格;
  • -M:按照月份进行排序;
  • -n:按照数字进行排序;
  • -r:反向排序;
  • -u:等同于 uniq,表示相同的数据仅显示一行;
  • -t:指定分隔符,默认使用[Tab]键分隔;
  • -o <输出文件>:将排序后的结果转存至指定文件;
  • -k:指定排序区域。
    运用实例:
    [root@localhost ~]# sort /etc/passwd#将/etc/passwd 文件中的账号进行排序

    #将/etc/passwd 文件中第三列进行反向排序[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd 

    将/etc/passwd 文件中第三列进行排序,并将输出内容保存至user.txt 文件中[root@localhost ~]# sort -t ':' -k 3 /etc/passwd -o user.txt[root@localhost ~]# cat user.txt 


    uniq 工具
    Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行。具体的命令语法格式为:uniq [选项] 参数。其中常用选项包括以下几种。
    -c:进行计数;
    -d:仅显示重复行;
    -u:仅显示出现一次的行;

    删除 testfile 文件中的重复行。[root@localhost ~]# cat testfile[root@localhost ~]# uniq testfile

    删除 testfile 文件中的重复行,并在行首显示该行重复出现的次数。[root@localhost ~]# uniq -c testfile 

    查找 testfile 文件中的重复行。[root@localhost ~]# uniq -d testfile

文件 输出 字段 内容 命令 处理 排序 工具 分隔符 数据 文本 用户 不同 格式 空格 系统 一行 脚本 统计 信息 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 快手数据库多久清理一次 数据库命名TB 铜陵门店管理软件开发公司 英雄联盟物品数据库s8 和计算机软件开发有关的专业 visio数据库模型转脚本 网络安全实训报告个人总结 翔港科技 工业互联网 网络安全和舆情处置工作 海南数据库安全箱销售厂家 闵行区好的软件开发注意事项 深圳车牌识别系统软件开发 最新网络安全保密协议范本 陈丰伟联通网络技术大会 藏汉双语软件开发的重要性 长沙网络安全手抄报 大大东网络技术工作室 合川区提供软件开发流程代理品牌 网络安全发型机构 好玩吧软件开发多久了 derby 数据库 重命名 服务器硬盘显示为ready 网站平台网络安全应急预案 查看数据库表名的语句 网络安全不能碰吗 重庆南川农副配送软件开发 最新网络安全保密协议范本 服务器通讯协议怎么设计 青岛盛鼎伟业互联网科技公司 网络安全教育心得体会标题
0