awk FS OFS RS ORS详解
awk默认从STDIN接受数据,打印文本到STDOUT
awk默认输出输入分割符:
- FS => Input field separater,字段分隔符, 默认空格类字符
- RS => Input record separater,行分隔符,默认\n
- OFS => Output field separater,输出字段分隔符,默认空格
- ORS => Output record separater,输出行分隔符,默认\n
-
echo '1a2a3a4a5' | awk -v RS=a '{print $0}'
echo '1a2a3a4a5' | awk '{BEGIN{RS="a"} {print $0}'
# 在shell中a没有引号可以直接作为string,但是放到awk中,a相当于变量,所有要加""定义RS='a'发现多打印空行,原因是echo输出了一个\n被最后一行的最后一个字段拿到,
本例中即是5\n但为什么$1,$2没有多打印空行呢?因为\n算是空字符,被当作field separater了,但是$0打印整体的时候
\n是会被打印成空行的,所以$2实际为空 - RS可以为正则表达式
echo -e '1ab2bc3cd4de5\c' | awk 'BEGIN{RS="[a-z]\+"} {print $0,RS,RT}'
# RS为分割符,RT为正则实际匹配到的内容 - print $0的时候OFS不会产生作用,此时被RS分割出来的record作为整体输出
路人甲 电话: 13777707771 手机: 010-12345678 路人乙 电话: 13912344321 手机: 010-56784321 QQ: 87654221
处理上述文件的时候,空格的格式为\n\n,在分割feild的过程中产生了NULL,即是我们定义的RS
-
echo "aaa bbb ccc" | awk -v OFS="|" '{print $0}' aaa bbb ccc echo "aaa bbb ccc" | awk -v OFS="|" '{$1=$1;print $0}' aaa|bbb|ccc
因为OFS是对字段进行操作的,只有我们对字段进行了操作,上面的结果才能正确的显现出来。除了利用$1=$1之外,我们还可以利用NF+=0同样可以实现类似的效果
上面原来文本的分隔符可以看做是”#\n”,重新定义记录分隔符的话可以定义为直接的回车符,字段的分隔符可以设置为空格。后面的$1=$1对字段操作,使OFS的定义生效。
- FS=""是,每个字符都是一段
- 当我们想以固定的长度来分隔列的时候,可以使用 FIELDWIDTHS 来代替 FS
例如,一行记录的前3个字符作为第一列,接下来的2个字符作为第二列,接下来的4个字符作为第三列 - awk默认将连续的空格,制表符(\t)换行符(\n)作为列分隔符,且会自动去掉行首和行尾的空格,制表符(\t)和(\n),但是FS="[ \t\n]"不会
- 打印自定义变量
- field使用正则匹配
172.16.20.200 51cjml.cn 172.16.20.200 v.51cjml.cn 172.16.20.200 superdirectory.51cjml.cn 172.16.20.200 crm.51cjml.cn 172.16.20.200 bauto.51cjml.cn 172.16.20.200 zhipei.51cjml.cn 172.16.20.200 shopcrm.51cjml.cn 172.16.20.200 vinmange.51cjml.cn 172.16.20.200 carmanage.51cjml.cn 172.16.20.200 cppmanage.51cjml.cn 172.16.20.200 cpsmanage.51cjml.cn
OFS只在使用$1,$2时打印才有用
- FS, RS等变量最要随便设置特殊字符
awk 'BEGIN{FS="UI";RS="";OFS="*"} {print $1,NF}' zz
设置FS="UI",后NF=1
awk -F"@" 'BEGIN{RS="";OFS="*"} {print $1,NF}' zz
设置特殊字符 @ 后,NF=2,是有问题的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律