AWK入门

简介

awk是一种编程语言,用于在linux/unix对文本和数据进行扫描与处理。数据可以来自标准输出,文件,管道。(以下以centos7 自带gawk为例讲解)

工作流程

逐行扫描文件,从第一行到最后一行,寻找匹配特定模式的行,并在这些行上执行用户操作。
Awk的基本结构由模式匹配和处理过程组成。
pattern {action}
Awk读取文件的每一行时,将比对是否与给定的模式相匹配,如果匹配则执行处理过程否则不出来。如无指定处理过程,则把匹配的行输出到标准输出即默认的处理动作是print打印行。
BEGIN 和 END ,他们被放置在没有任何数据读取之前和所有数据完成读取以后执行
在这里插入图片描述

基本语法

gawk 【options 】 【-f programfile 】 file

-F fs, --filed-seperator fs
指定以 fs 作为输入行的分隔符,默认分隔符为空格或制表符
-v var=val ,--assign var=val 
在脚本执行前指定一个变量var 值为val
-f programfile ,--file programfile 
从脚本文件中读取awk指令
-W copyleft,-W copyright ,--copyleft,-- copyright
输出版权信息
-W compact ,-W traditional ,--compact,--traditional
使用兼容模式运行,GUN扩展选项将被禁用 

-W dump-variables[=file], --dump-variables[=file]
打印全局变量(变量名,类型,值)到文件中,如果没有提供文件名,则自动输出至名为
dump-variables的文件中

-W help,-W usage, --help,--usage
显示各个选项的简短描述

语法结构

一个awk程序包含一些列的模式{动作指令}或者是函数定义,模式可以是BEGIN,END,表达式,用来限定操作对象的表达式用逗号分隔;动作指令需要用花括号{}包起来。
示例

文件中每有一行空白则打印一次
awk /^$/ {print “This is Blank Line”} test.txt
打印匹配test的行
awk /test/ test.txt

脚本执行 awk -f test.sh test.txt
test.sh
/^$/ {print “This is Blank Line”}
或者  ./test.sh test.txt
#!/bin/gawk -f
/^$/ {print “This is Blank Line”}

AWK 操作指令

记录与字段

Awk 一次从文件中读取,并将记录存储在字段变量$0中。记录以分隔符(默认为空格或制表符),分割为字段并存储在 $1,$2,… $NF中。内建变量NF为记录的字段个数。这个记录指读到的每一行。

字段分隔符

默认awk 读取数据以空格或制表符为分隔符,但是可以通过-F 或者 FS(field seperator) 变量来改变分隔符
gawk -F: ‘{print $1}’ /etc/passwd 以: 分割符,读取打印
gawk ‘BEGIN{FS=“:”}{print $1}’ /etc/passwd
指定多个分隔符(起一样的作用)
echo hello:the,world |gawk -F ‘[:,]’ ‘{print $2}’

内置变量
ARGC	命令行参数个数
FILENAME	当前输入文档的名称
FNR	当前输入文档的编号,输入多个文档时很有用
NR	输入流的当前记录编号
NF	当前记录的字段个数
FS	字段分割符
OFS	输出字段分割符,默认空格
ORS	输出记录分割符,默认为换行\n
RS	输入记录分割符,默认为换行\n

表达式和操作符

表达式

由变量、常量、函数、正则表达式、操作符组成,Awk中变量有字符串变量和数字变量。如在Awk中定义的变量没有初始化,则初始值为空字符串或0。字符操作时一定要加引号

操作符

+、-、*、/,%,^(幂运算),++(自增1)、–、>,<,>=,<=,==,!=,(匹配),!(不匹配)
|| (或),&&(与)
+= 相加后赋值给变量(x+=9 ,x=x+9)
-= 相减后赋值给变量(x-=9 ,x=-+9)
/=

  • =

流程控制语句

if

语法1
if expr
action1
else
action2

语法2
if expr action1 ;else action2

while 循环

语法1
while (条件1)
动作
gawk ‘i=1 {} BEGIN {while (i<10) {++i;print i}}’ tet.txt
定义i=1 {} 无动作,默认打印

语法2
do
动作
while (条件)
gawk ’ BEGIN { do {++i;print i} while (i<10) }’ tet.txt

for循环

for (变量;条件;计数器)
动作
gawk BEGIN ‘{for (i=1;i<=10;i++) print i}’ {print $1} tet.txt

关键字 Break 与Continue

Break 跳出循环
Continue 停止本次循环,立即进入下一次

常用函数

rand()

作用:产生0~1之间的浮点类型的随机数,rand 产生随机数时,需要通过stand()设置一个参数,否则单独的rand()每次产生的随机数都是一样的
gawk ‘BEGIN {print rand();srand();print rand()}’ tet.txt

gsub(x,y,z)

作用:在字符串z中使用y替换与正则表达式x相匹配的所有字符,z默认为$0
在这里插入图片描述

sub(x,y,z)

作用:在字符串z中使用y替换与正则表达式x相匹配的第一个子串,z默认为$0

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 对于Linux中的awk的使用,可以参考菜鸟教程上的相关内容。awk是在Unix上实现的,而我们在Linux上使用的awk实际上是GNU awk,简称为gawk。另外还有一个版本是New awk,简称为nawk,但在Linux中最常用的是gawk。\[1\]在awk中,$(NF-1)代表倒数第二个字段,可以通过设置分隔符来提取指定字段的值。例如,可以使用命令awk -F ':' '{print $1, $(NF-1)}'来打印文件demo.txt中每行的第一个字段和倒数第二个字段的值。\[2\]此外,可以使用if语句来筛选满足条件的行。例如,可以使用命令awk -F ':' '$1 == "root" {print $1}'来输出文件demo.txt中第一个字段等于"root"的行。\[3\]希望这些信息对你有帮助。 #### 引用[.reference_title] - *1* [awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)](https://blog.csdn.net/weixin_42398055/article/details/116849176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [awk 入门教程](https://blog.csdn.net/KingJin_CSDN_/article/details/108077430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值