前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >awk入门小记

awk入门小记

作者头像
HHTjim 部落格
发布2022-09-26 10:40:40
4590
发布2022-09-26 10:40:40
举报
文章被收录于专栏:HHTjim'S 部落格

awk入门小记

作者:matrix 被围观: 1,290 次 发布时间:2019-11-06 分类:command Linux | 无评论 »

这是一个创建于 1029 天前的主题,其中的信息可能已经有所发展或是发生改变。

awk用于unix的文本处理,经常出现和使用。读取每一行文本进行格式化输出。

测试环境 Macos

awk简单操作

默认使用空格进行字符串分割

代码语言:javascript
复制
echo '1 2 3' |awk '{print $0}' # 1 2 3

echo '1 2 3' |awk '{print $3}' # 3

echo -e "1\n2\n3" |awk '/[23]/' #正则条件查找

echo -e "abc\n1a2\n33" |awk '/a/' #正则条件查找字母a 

awk '{print $3}' file_path #指定文件

ls -alh|awk '/^d/' #输出目录
# drwxr-xr-x    3 panc  staff    96B  7 16 23:32 pt-program

echo '1-2-3' |awk -F '-' '{print $2}' #指定分割符号 -  输出 2

0表示当前行 1表示第一个分割的字段

awk命令后面跟操作的语句字符串''包裹,每个语句段落用花括号{}包裹,语句段落中用分号;分隔语句。

代码语言:javascript
复制
echo -e '1 2 3\n4 5 6' |awk '{print $0;print("-end-")}'
echo -e '1 2 3\n4 5 6' |awk '{print $0;}{print("-end-")}'
#上面输出结果相同
#1 2 3
#-end-
#4 5 6
#-end-


echo -e '1 2 3\n4 5 6' |awk '{print $1,$3}'
#输出
#1 3
#4 6

使用内置变量

NF表示当前行有多少个分割字段

代码语言:javascript
复制
echo  '1-2-3' |awk -F '-' '{print $(NF)}' # 3  获取最后一个分割字符
echo  '1-2-3' |awk -F '-' '{print $(NF-1)}' # 2  获取倒数第二个分割字符

其他变量

NR表示当前处理的是第几行

BEGIN预处理

在执行处理之前提前设置一些信息

比如之前的-F参数可以使用BEGIN来设置

代码语言:javascript
复制
echo -e "a-b-c" |awk 'BEGIN{FS="-"} /^a/{print $0}' #设置分割符为-

echo -e "a-b-c" |awk 'BEGIN{FS="-";print "this title::"} {print $0}' #设置输出的首行标题

echo -e "1122\n3344" |awk 'BEGIN{FIELDWIDTHS="2 2";} {print $1,$2}' #固定字段宽度  (mac os中测试失败)
#输出
#11 22
#33 44

内置变量

FS字段分隔符

FIELDWIDTHS指定字段宽度

ORS指定输出的行分隔符

if逻辑处理

awk还可以支持函数和复杂的逻辑处理,完全可以在里面定义函数 调用 判断

例子:

显示红色error

绿色seccess

白色log

代码语言:javascript
复制
echo -e 'success\nerror\nsuccess\nloginfo' | awk  \
'{
 if (/error/) {
    print "\033[91m" $0 "\033[0m"
 } else if (/success/){
    print "\033[32m" $0 "\033[0m"; 
 }else{
    print $0
 }
 next;
}'

上面语句有换行的段落方便阅览。一行简写也是可以

例子:

判断值大小

代码语言:javascript
复制
echo -e '12\n14\n232\n90' |awk '{if($0>=90) print $0}' #输出>=90的数据
#232
#90

for循环

使用for循环计算求和

代码语言:javascript
复制
echo '5' |awk  '{ \
total = 0
for (var = 1; var < $0; var++)
{
    total += var
}
print "total:",total
}'

Built-In Functions函数使用

awk中语义中支持函数的使用

代码语言:javascript
复制
echo -e 'H htjim\nDot\ncom\n009' |awk '{print toupper($0)}'#转换为大写

内置函数

toupper 转换为大写

tolower 转换为小写

rand 随机数

其他函数参考手册:

https://www.gnu.org/software/gawk/manual/html_node/Built_002din.html#Built_002din

自定义函数

自定义彩色文字输出函数awk内部执行调用

代码语言:javascript
复制
echo -e 'success\nerror\nsuccess\nloginfo' | awk  \
'
function red(s) {
    printf "\033[1;31m" s "\033[0m "
}
function green(s) {
    printf "\033[1;32m" s "\033[0m "
}
function blue(s) {
    printf "\033[1;34m" s "\033[0m "
}


{
if (/error/) {
    print red($0)
 } else if (/success/){
    print green($0)
 }else{
    print blue($0)
 }

}'

其他例子

结合tail -f log显示红色报错提示

代码语言:javascript
复制
 tail -f test.log |  awk '{
 if (/success/) {
 print "\033[91m" $0 "\033[0m"
 } else {
 print "\033[32m" $0 "\033[0m"; 
 }
 next;
}';

next用于直接跳到下一行文本进行执行 有点continue的意思

参考:

https://likegeeks.com/awk-[command](https://www.hhtjim.com/category/command)/

http://www.ruanyifeng.com/blog/2018/11/awk.html

https://www.cnblogs.com/[Linux](https://www.hhtjim.com/category/linux)probe/p/5745381.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • awk入门小记
    • awk简单操作
      • 使用内置变量
        • BEGIN预处理
          • if逻辑处理
            • for循环
              • Built-In Functions函数使用
                • 自定义函数
                  • 其他例子
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档