AWK

AWK

格式:awk [options] ‘pattern{action}’ file

逐行处理,默认以“换行符”为标记识别每一行,以用户指定的“分隔符”将行分割成字段,字段按照顺序,分别对应到awk的内置变量中($1,$2,$3…),默认“分隔符”为空格,$0 表示整行

内置变量:
	FS:输入字段分隔符,默认为空白字符
	OFS:输出字段分隔符,默认为空白字符
	RS:输入记录分隔符(输入换行符),指定输入时的换行符
	ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
	NF:当前行的字段的个数(即当前行被分割成了几列),字段数量
	NR:行号,当前处理的文本行的行号
	FNR:各文件分别计数的行号
	FILENAME:当前文件名
	ARGC:命令行参数的个数
	ARGV:数组,保存的是命令行所给定的各参数
	
	自定义变量:1、[option]位置 -v var=value  2、{action}位置 { var1 = value1;var2=value2;print.....}
Action:
a、print 和 printf:printf动作与printf命令的区别:
	1、printf动作与需要格式化输出的文本字段之间需要用“,”隔开,printf命令不需要;
	2、printf命令只有一个“格式替换符”时,格式化输出的多个文本字段可以重复匹配使用这个“格式替换符”,printf动作需要相应个数的“格式替换符”
b、awk [option] '{if (条件1){动作1}elif(条件2){动作2}else{动作3}}'  file
c、awk  'BEGIN{for(i=1;i<=6;i++){print i}}'
d、awk -v i=1 'BEGIN{while(i<=5){print i ; i++}}'  
	或 awk 'BEGIN{i=1;while(i<=5){print i; i++}}' 
	或 awk BEGIN{i=1;do{print i; i++}while(i<=5)}'
e、continue、break、next、exit
Pattern
1、空模式
2、关系运算符模式: <,>,<=,>=,==,!=,~pattern(匹配正则为真),!~pattern(不匹配正则为真)
3、BEGIN/END模式
4、正则模式: awk '/正则表达式/{Action}' file
5、行范围模式:awk '/正则1/,/正则2/{Action}' file

ps: 
	1、Program中使用的是扩展正则表达式;
	2、当使用{x,y}这种次数匹配的正则表达式时,需要配合--posix选项或者--re-interval选项
数组:
awk中数组的下标默认从1开始
awk中允许数组的值为空,在引用了数组中一个不存在的元素后,数组会自动创建一个该元素,并将其赋值为空。
判断数组是否有某个下标的元素存在与否时,不应该用vars[N]=="",而应该用if(N in vars){action}else{action}这种方法
数组的下标不仅可以为“数字”,也可以为任意“字符串”
awk '{for(i=1;i<=NF;i++) {count[$i]++}}END{for(j in count){print j,count[j]}}' test
内置函数:
算数函数:rand、srand、int
	  awk 'BEGIN{srand();print int(rand()*1000)}'
字符串函数:
	sub("查找字符","替换为字符","字段")
	gsub,
	length("字段"),
	index("字符","字段")
	split("字符串","数组","分隔符") 		(split函数有返回值,值就是数组长度)
其他函数:
	asort(数组,\新数组)(不添加新数组的方式对asort函数对数组排序后,数组下标会被重置为数字,从1开始)
	asorti(数组,新数组)(对数组下标进行排序,生成一个下标组成的新数组)

三元运算符:
	判断条件?Action1:action2
打印奇数行:
	awk i=!i file
03-08
### 使用 `awk` 进行文本处理 #### 基本语法 `awk` 是一种用于处理和分析文本的强大工具,其基本结构如下: ```bash awk 'pattern { action }' filename ``` 这里 `pattern` 定义何时执行动作,而 `{action}` 则定义具体要做什么。如果没有指定模式,则默认对每一行都应用该操作[^1]。 #### 实际例子展示 ##### 示例 1: 打印特定列的内容 假设有一个名为 `data.txt` 文件,其中包含三列表格数据(姓名、年龄、城市)。为了仅显示第二列即年龄信息可以这样做: ```bash awk '{print $2}' data.txt ``` 此命令会遍历整个文档并输出每行中的第二个字段[^2]。 ##### 示例 2: 设置变量并通过 BEGIN 块打印消息 可以通过 `-v` 参数向脚本传递外部变量,在程序启动之前通过 `BEGIN{}` 来访问它们: ```bash awk -v greeting="Hello" 'BEGIN {print greeting}' ``` 这段代码将在任何输入读取前立即显示出字符串 "Hello"[^3]。 ##### 示例 3: 应用条件筛选记录 如果想要找出所有来自北京的人的信息,可以在模式部分加入适当的选择标准: ```bash awk '$3 ~ /Beijing/ {print $0}' people_list.txt ``` 这里的 `$3 ~ /Beijing/` 表达式用来匹配第三列为 “Beijing”的那些行,并将其完整内容(`$0`) 输出出来。 #### 清除缓存注意事项 当涉及到文件系统的更改时,如删除大量日志或其他大容量的数据集之后,最好先运行 `sync` 命令以确保所有的写入都被提交到磁盘上再继续其他清理工作,防止潜在的数据丢失风险[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值