安全杂记 - Linux文本三剑客之awk

news/2025/3/19 11:14:09/

目录

  • 1.什么是AWK
  • 2.正则表达式
  • 3.语法
  • 4.内置变量
    • 示例
    • printf命令
    • 5.复现awk经典实例
      • (1).插入几个新字段
      • (2).格式化空白
      • (3).筛选IPv4地址
      • (4).筛选给定时间范围内的日志

1.什么是AWK

awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。三剑客最好要搭配神兵利器正则表达式一起使用。

2.正则表达式

在这里插入图片描述

3.语法

  • 1.awk [options] 'program'` `var=value file
  • 2.awk [options] -f programfile var=value file…``
  • 3.awk [options] ``‘BEGIN{ action;… } pattern{ action;… } END{
    action;… }’ file
    语法说明
  • 1.pattern部分决定动作语句何时触发及触发事件:BEGIN、END
    2.action 对数据进行处理,放在{}内指明:print、printf
    3.最常用的是 print,默认以空白字符分隔
    4.options 参数:输入分隔符,默认以空白字符分隔,通过 -F 选项来执行分隔符

4.内置变量

  • FS输入字段分隔符默认为空白字符
  • OFS输出字段分隔符,默认为空白字符
  • RS输入记录分隔符,指定输入时的换行符,原换行符仍有效
  • ORS输出记录分隔符,输出时用指定符号代替换行符
  • NF :字段数量,共有多少字段, N F 引用最后一列, NF引用最后一列, NF引用最后一列,(NF-1)引用倒数第2列
  • NR行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
  • FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
  • FILENAME当前文件名
  • ARGC命令行参数的个数
  • ARGV :数组,保存的是命令行所给定的各参数,查看参数

示例

[root@localhost ~]# cat awkdemo //示例文件
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[root@localhost ~]# awk -v FS=':' '{print $1,$2}' awkdemo
hello world
linux redhat
along love
[root@localhost ~]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo
hello---world
linux---redhat
along---love
[root@localhost ~]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo
hello world---linux redhat---along love---[root@localhost ~]# awk -F: '{print NF}' awkdemo
2
4
3
[root@localhost ~]# awk -F: '{print $(NF-1)}' awkdemo
hello
lalala
love
[root@localhost ~]# awk '{print NR}' awkdemo awkdemo
1
2
3
4
5
6
[root@localhost ~]# awk END'{print NR}' awkdemo awkdemo
6
[root@localhost ~]# awk '{print FNR}' awkdemo awkdemo
1
2
3
1
2
3
[root@localhost ~]# awk '{print FILENAME}' awkdemo
awkdemo
awkdemo
awkdemo
[root@localhost ~]# awk 'BEGIN {print ARGC}' awkdemo awkdemo
3

printf命令

(1)格式化输出

printf` `"FORMAT"``, item1,item2, ...
  • 必须指定FORMAT

  • 不会自动换行,需要显式给出换行控制符\n

  • FORMAT 中需要分别为后面每个item 指定格式符

(2)格式符:与item 一一对应

  • %c: 显示字符的ASCII码

  • %d, %i: 显示十进制整数

  • %e, %E: 显示科学计数法数值

  • %f :显示为浮点数,小数 %5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上

  • %g, %G :以科学计数法或浮点形式显示数值

  • %s :显示字符串;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示

  • %u :无符号整数

  • %%: 显示% 自身

(3)修饰符:放在%c[/d/e/f…]之间

  • #[.#]:第一个数字控制显示的宽度;第二个# 表示小数点后精度,%5.1f
  • -:左对齐(默认右对齐) %-15s
  • +:显示数值的正负符号 %+d
[root@localhost ~]# awk -F: '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
// 第一列显示小于20的字符串;第2列显示整数并换行
[root@localhost ~]# awk -F: '{printf "%20s---%u\n",$1,$3}' /etc/passwdroot---0bin---1daemon---2
// 使用-进行左对齐;第2列显示浮点数             
[root@localhost ~]# awk -F: '{printf "%-20s---%-10.3f\n",$1,$3}' /etc/passwd
root                ---0.000     
bin                 ---1.000     
daemon              ---2.000     
adm                 ---3.000               

5.复现awk经典实例

(1).插入几个新字段

在"a b c d"的b后面插入3个字段e f g

[root@localhost ~]# echo "a b c d" | awk '{$2=$2" e f g";print}'
a b e f g c d

(2).格式化空白

移除每行的前缀、后缀空白,并将各部分左对齐。

[root@localhost ~]# cat shiyan.txt aaaa        bbb     ccc                 bbb     aaa ccc
ddd       fff             eee gg hh ii j
[root@localhost ~]# awk 'BEGIN{OFS="\t"}{$1=$1;print}' shiyan.txt 
aaaa    bbb     ccc
bbb     aaa     ccc
ddd     fff     eee     gg      hh      ii      j

(3).筛选IPv4地址

从ip a命令的结果中筛选出除了lo网卡外的所有IPv4地址。
在这里插入图片描述

在这里插入图片描述

(4).筛选给定时间范围内的日志

下面strptime2()实现的是将10/Nov/2019:23:53:44+08:00格式的字符串转换成epoch值,然后和which_time比较大小即可筛选出精确到秒的日志。

BEGIN{# 要筛选什么时间的日志,将其时间构建成epoch值which_time = mktime("2019 11 10 03 42 40")
}{# 取出日志中的日期时间字符串部分match($0,"^.*\\[(.*)\\].*",arr)# 将日期时间字符串转换为epoch值tmp_time = strptime2(arr[1])# 通过比较epoch值来比较时间大小if(tmp_time > which_time){print }
}# 构建的时间字符串格式为:"10/Nov/2019:23:53:44+08:00"
function strptime2(str   ,dt_str,arr,Y,M,D,H,m,S) {dt_str = gensub("[/:+]"," ","g",str)# dt_sr = "10 Nov 2019 23 53 44 08 00"split(dt_str,arr," ")Y=arr[3]M=mon_map(arr[2])D=arr[1]H=arr[4]m=arr[5]S=arr[6]return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}function mon_map(str   ,mons){mons["Jan"]=1mons["Feb"]=2mons["Mar"]=3mons["Apr"]=4mons["May"]=5mons["Jun"]=6mons["Jul"]=7mons["Aug"]=8mons["Sep"]=9mons["Oct"]=10mons["Nov"]=11mons["Dec"]=12return mons[str]
}

http://www.ppmy.cn/news/1016487.html

相关文章

【JavaScript 】浏览器事件处理

1. 什么是浏览器事件? 浏览器事件是指在网页中发生的各种交互和动作,例如用户点击按钮、页面加载完成、输入框文本变化等。通过处理这些事件,可以编写相应的JavaScript代码来实现特定的功能和行为。 2. 常见的浏览器事件 以下是一些常见的浏览器事件及其用途的详细介绍: c…

[服务被植入脚本,数据泄密?数据库如何做内网访问?]

目录 前言: 数据库内网访问的方式: 使用nginx进行反向代理可以实现将外部用户的请求转发到内网中的数据库服务器上。具体步骤如下: 使用SSH隧道可以建立加密的连接,从而实现外部用户通过SSH隧道访问内网中的数据库。具体步骤如下: 使用端…

【2023年11月第四版教材】《第2章-信息技术发展之新一代信息技术及应用(第四部分)》

第2章-信息技术发展之新一代信息技术及应用(第四部分) 5 新一代信息技术及应用5.1 物联网5.2 云计算5.3 大数据 5 新一代信息技术及应用 5.1 物联网 要素具体内容存储技术定义物联网是指通过信息传感设备,按约定的协议将任何物品与互联网相连接&#x…

前端处理后端返回的数据中有\n\n字样的换行符标识

后端返回的数据: 上面圈着的部分就是\n,前端需要将数据进行换行,对于这类型的数据,在前端页面是需要进行稍微处理才能正常显示。如果没有经过处理,那么内容是不会在有换行符的位置进行换行显示的 解决办法1&#xff1…

滑动窗口(全面清晰/Java)

数组模拟单调队列 分析 以k3举例&#xff1a; (1)利用单调队列的性质&#xff1a; <1>最小值&#xff1a;确保队列单调递增&#xff0c;处理后&#xff0c;队头即是最小值。 <2>最大值&#xff1a;确保队列单调递减&#xff0c;处理后&#xff0c;队头即是最大值…

http历史版本

1&#xff0c;HTTP0.9 最早的http版本&#xff0c;后来才被定义为0.9版本。 这时候通信采用的是纯文本格式&#xff1b; 只支持get请求&#xff0c;且在服务器响应之后就关闭连接&#xff1b; 没有请求头的概念&#xff0c;功能比较简单。 2&#xff0c;HTTP1.0 这个版本增…

R119772795 记录详情

题目描述 在奶牛回家休息和娱乐之前&#xff0c;Farmer John 希望它们通过玩游戏获得一些智力上的刺激。游戏板由 n 个相同的孔组成&#xff0c;这些孔最初都是空的。一头母牛要么用石头盖住一个洞&#xff0c;要么揭开一个先前被盖住的洞。游戏状态的定义是哪些洞被石头覆盖&…

使用MIT Kerberos Ticket Manager在windows下浏览器访问hadoop页面

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置说明安装Firefox浏览器安装MIT Kerberos Ticket Manager客户端配置krb5.ini文件配置MIT Kerberos Ticket Manager客户端配置Firefox浏览器代理参数 访问WebUI 前言 kerberos是一种计算机…