AWK 命令输出

问题描述 投票:0回答:1

我正在尝试捕获“许可证名称”、“用户”、“许可证总数”、“使用的许可证数量”、“到期日期”、“许可证签出日期”、“服务器名称”的值以下输出:

Users of avy_amba_portfolio:  (Total of 21 licenses issued;  Total of 5 licenses in use)
  "avy_amba_portfolio" v1.5, vendor: AVERYDES, expiry: 30-apr-2024

    user1 server1 /dev/pts/5 (v0.20220708) (license_server_1/1234 3402), start Tue 3/5 22:22
    user1 server6 /dev/pts/22 (v0.20220708) (license_server_1/1234 488), start Wed 3/6 1:19
    user1 server1 /dev/pts/80 (v0.20220708) (license_server_1/1234 3554), start Wed 3/6 23:55
    user1 server1 /dev/pts/83 (v0.20220708) (license_server_1/1234 5850), start Thu 3/7 0:03
    user2 server1 /dev/pts/47 (v0.20220920) (license_server_1/1234 1713), start Thu 3/7 3:10

Users of avy_jtag:  (Total of 6 licenses issued;  Total of 1 license in use)
  "avy_jtag" v1.5, vendor: AVERYDES, expiry: 30-apr-2024

    user1 server6 /dev/pts/22 (v0.20220708) (license_server_1/1234 1491), start Wed 3/6 1:19

我正在使用以下命令:

awk 'BEGIN { printf "%-20s%-20s%-30s%-25s%-20s%-30s%-20s\n", 
  "License Name", "User", "Total Number of Licenses", "Number of license used", "Expiry Date", "License Checkout Date", "Servername" }
   /Users of/ { license = $3; totallicense = $6; usedlicense = $11; 
     getline; getline; 
     next
   }
   /expiry/ { 
     expiry_date = $6; getline; getline; next
   } 
   { printf "%-20s%-20s%-30s%-25s%-20s%-30s%-20s\n", 
     license, $1, totallicense, usedlicense, expiry_date, $8" "$9" "$10, $2 
 }' /root/avery_lic_usage.log

但是,它无法捕获“avy_amba_portfolio”v1.5,供应商:AVERYDES,到期日:30-apr-2024”行上的“到期”日期。以下是命令的示例输出:

License Name        User                Total Number of Licenses      Number of license used   Expiry Date         License Checkout Date         Servername
avy_amba_portfolio: user1               21                            5                                            Tue 3/5 22:22                 server1
avy_amba_portfolio: user1               21                            5                                            Wed 3/6 1:19                  server6
avy_amba_portfolio: user1               21                            5                                            Wed 3/6 23:55                 server1
avy_amba_portfolio: user1               21                            5                                            Thu 3/7 0:03                  server1
avy_amba_portfolio: user2               21                            5                                            Thu 3/7 3:10                  server1
avy_amba_portfolio:                     21                            5
avy_jtag:           user1               6                             1                                            Wed 3/6 1:19                  server6

我怎样才能让它发挥作用?另外,我想删除输出中用户字段中空白的行。

shell awk rhel8
1个回答
0
投票

正如评论中提到的,

getline; getline; next
告诉
awk
跳过接下来的两行输入,在本例中(第一个
getline; getline; next
)意味着
expiry
行被忽略。第二个
getline; getline; next
也会引起问题(第一个许可证的
User
值向上移动一位)。

修改输入以提供数据中的一些视觉差异:

$ cat avery_lic_usage.log
Users of avy_amba_portfolio:  (Total of 21 licenses issued;  Total of 5 licenses in use)
  "avy_amba_portfolio" v1.5, vendor: AVERYDES, expiry: 30-apr-2024

    user1 server1 /dev/pts/5 (v0.20220708) (license_server_1/1234 3402), start Tue 3/5 22:22
    user2 server6 /dev/pts/22 (v0.20220708) (license_server_1/1234 488), start Wed 3/6 1:19
    user3 server1 /dev/pts/80 (v0.20220708) (license_server_1/1234 3554), start Wed 3/6 23:55
    user4 server1 /dev/pts/83 (v0.20220708) (license_server_1/1234 5850), start Thu 3/7 0:03
    user5 server1 /dev/pts/47 (v0.20220920) (license_server_1/1234 1713), start Thu 3/7 3:10

Users of avy_jtag:  (Total of 6 licenses issued;  Total of 1 license in use)
  "avy_jtag" v1.5, vendor: AVERYDES, expiry: 30-may-2024

    user6 server6 /dev/pts/22 (v0.20220708) (license_server_1/1234 1491), start Wed 3/6 1:19

如果我们可以依赖感兴趣线的独特模式,就不需要

getline
调用。

一个

awk
想法:

awk '
BEGIN             { fmt = "%-20s%-20s%-30s%-25s%-20s%-30s%-20s\n"

                    printf fmt,
                    "License Name", "User", "Total Number of Licenses",
                    "Number of license used", "Expiry Date",
                    "License Checkout Date", "Servername"
                  }

/Users of/        { license      = $3
                    totallicense = $6
                    usedlicense  = $11
                    next
                  }

/expiry/          { expiry_date  = $6
                    next
                  }

/license_server_/ { printf fmt,
                    license, $1, totallicense,
                    usedlicense, expiry_date,
                    $8" "$9" "$10, $2
                  }

' avery_lic_usage.log

这会生成:

License Name        User                Total Number of Licenses      Number of license used   Expiry Date         License Checkout Date         Servername
avy_amba_portfolio: user1               21                            5                        30-apr-2024         Tue 3/5 22:22                 server1
avy_amba_portfolio: user2               21                            5                        30-apr-2024         Wed 3/6 1:19                  server6
avy_amba_portfolio: user3               21                            5                        30-apr-2024         Wed 3/6 23:55                 server1
avy_amba_portfolio: user4               21                            5                        30-apr-2024         Thu 3/7 0:03                  server1
avy_amba_portfolio: user5               21                            5                        30-apr-2024         Thu 3/7 3:10                  server1
avy_jtag:           user6               6                             1                        30-may-2024         Wed 3/6 1:19                  server6
© www.soinside.com 2019 - 2024. All rights reserved.