LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 285|回复: 0

精通awk系列(29):awk几个实用的扩展插件

[复制链接]
发表于 2023-12-27 15:00:38 | 显示全部楼层 |阅读模式

几个常见的gawk扩展

使用扩展的方式:

awk -l ext_name 'BEGIN{}{}END{}'
awk '@load "ext_name";BEGIN{}{}END{}'
1.文件相关的扩展
awk和文件相关的扩展是”filefuncs”。

它支持chdir()、stat()函数。

2.awk文件名匹配扩展
“fnmatch”扩展提供文件名通配。

@load "fnmatch"
result = fnmatch(pattern, string, flags)
3.awk原处修改文件
awk通过加载inplace.awk,也可以实现sed -i类似的功能,即内容直接修改源文件(其本质是先写入临时文件,写完后将临时文件重命名为源文件进行覆盖)。

例如:

# 从源文件中直接去掉包含strict的行
awk -i inplace '!/strict/{print}' x.txt
awk '@include "inplace";!/strict/{print}' x.txt

# 禁用原处替换,inplace默认值为1。
# inplace应当在BEGIN中设置,而非main中设置,因为这时已开始读文件
awk -i inplace 'BEGIN{inplce=0}!/strict/{print}' x.txt
awk '@include "inplace";BEGIN{inplce=0}!/strict/{print}' x.txt

# 指定后缀名进行备份,下面将生成x.txt和x.txt.bak文件,x.txt.bak是原文内容
awk -i inplace 'BEGIN{INPLACE_SUFFIX=".bak"}!/strict/{print}' x.txt
awk '@include "inplace";BEGIN{INPLACE_SUFFIX=".bak"}!/strict/{print}' x.txt
4.awk多进程扩展
“fork”扩展提供多进程相关功能。

@load "fork"

pid = fork()
创建一个子进程,对子进程返回值为0,对父进程返回值为子进程的PID,返回-1表示错误。
在子进程中,PROCINFO["pid"]和PROCINFO["ppid"]会随之更新。

ret = waitpid(pid)
等待某个子进程退出。awk的waitpid是非阻塞的,如果等待的进程还未退出,则返回值为0,等待的进程已经退出,则返回该进程pid。

ret = wait()
等待任意一个子进程退出。wait()是阻塞的,必须等待到一个子进程退出,同时返回该子进程PID。
例如:

awk '
    @load "fork"
    BEGIN{
        if( (pid=fork()) == 0 ){
            print "Child Process"
            print "CHILD PID: "PROCINFO["pid"]
            print "CHILD PPID: "PROCINFO["ppid"]
            system("sleep 1")
        } else {
            while(waitpid(pid) == 0){
                system("sleep 1")
            }
            print "Parent PID: "PROCINFO["pid"]
            print "Parent PPID: "PROCINFO["ppid"]
            print "Parent Process"
        }
    }
'
5.awk日期时间扩展
“time”扩展提供了两个函数。

@load "time"

the_time = gettimeofday()
    获取当前系统时间,以浮点数方式返回,精确的浮点小数位由操作系统决定  

res = sleep(sec)
    睡眠指定时间,可以是小数秒
$ awk '@load "time";BEGIN{printf "%.9f\n",gettimeofday()}'
1572422333.740148067

$ awk '@load "time";BEGIN{printf "%.19f\n",gettimeofday()}'
1572422391.5475890636444091797
睡眠是很好用的功能:

awk '@load "time";BEGIN{sleep(1.2);print "hello world"}'

文章链接: https://www.junmajinlong.com/shell/awk/awk_extensions/
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表