首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以Awk作为单行传递数据,避免使用管道打开多个套接字

以Awk作为单行传递数据,避免使用管道打开多个套接字
EN

Stack Overflow用户
提问于 2022-03-21 12:14:48
回答 4查看 79关注 0票数 1

下面我有一个关于用awk解析数据的问题,这个问题很有效,但看上去不那么有效,而且可以在我提出的这一点上加以改进。

对此有任何建议和帮助,将不胜感激。

  • 设想一:

原始数据:

代码语言:javascript
复制
# dmesg | awk  '/blk_update_request/{ if ($7 =="sector") print $0}' | head -5
[14740442.054675] blk_update_request: I/O error, dev sde, sector 3618747392
[14740442.055693] blk_update_request: I/O error, dev sde, sector 3618746368
[14740442.056807] blk_update_request: I/O error, dev sde, sector 3618745344
[14740442.057927] blk_update_request: I/O error, dev sde, sector 3618744320
[14740442.059074] blk_update_request: I/O error, dev sde, sector 3618743296

审判:

代码语言:javascript
复制
# dmesg | awk  '/blk_update_request/{ if ($7 =="sector") print $6}'| cut -d, -f1|head -5
sde
sde
sde
sde
sde

备注

这很好,但是为了简单地删除分号,,我再次使用了cut,它以|的形式添加了另一个套接字。

所需

这是否可以与awk本身进行调整,以便在一次调用中完成。

  • Secario2

原始数据:

代码语言:javascript
复制
Mar 20 05:15:02 transpire kernel: [15432418.855144] EXT4-fs (dm-13): error count since last fsck: 100
Mar 20 06:16:12 transpire kernel: [15436088.797185] EXT4-fs (dm-12): error count since last fsck: 20
Mar 20 07:17:22 transpire kernel: [15439758.736285] EXT4-fs (dm-15): error count since last fsck: 40
Mar 20 07:17:22 transpire kernel: [15439758.736293] EXT4-fs (dm-14): error count since last fsck: 2
Mar 20 19:48:50 transpire kernel: [15484846.579068] EXT4-fs (dm-11): error count since last fsck: 55
Mar 20 19:48:50 transpire kernel: [15484846.580064] EXT4-fs (dm-10): error count since last fsck: 41
Mar 21 05:16:49 transpire kernel: [15518924.611572] EXT4-fs (dm-13): error count since last fsck: 100
Mar 21 06:17:59 transpire kernel: [15522594.553205] EXT4-fs (dm-12): error count since last fsck: 20
Mar 21 07:19:09 transpire kernel: [15526264.495077] EXT4-fs (dm-14): error count since last fsck: 2
Mar 21 07:19:09 transpire kernel: [15526264.495086] EXT4-fs (dm-15): error count since last fsck: 4
代码语言:javascript
复制
# awk '/dm/{print $8|"sort -u"}' /var/log/messages
(dm-10):
(dm-11):
(dm-12):
(dm-13):
(dm-14):
(dm-15):
error
enter code here

审判:

代码语言:javascript
复制
# awk '/dm/{print $8|"sort -u"}' /var/log/messages|tr -d '():'|sed '$ d'
dm-10
dm-11
dm-12
dm-13
dm-14
dm-15

同样,正如上面所述,我无法将其转换为单个awk调用,因此,我使用tr来砍父函数,而使用sed移除error,因为这是最后一行。

期望:这能在同一个awk呼叫中完成吗?

EN

回答 4

Stack Overflow用户

发布于 2022-03-21 12:30:03

在第一个示例中使用dmesg | awk,第二个示例使用/var/log/messages作为输入文件,我将在问题中使用示例数据,并从示例file中读取

对于第一部分,您可以将字段分隔符更改为可选逗号和1个或更多空格。

然后与字段nr 7和打印字段nr6进行比较。

代码语言:javascript
复制
awk -F',?[[:space:]]+' '/blk_update_request/ && $7 =="sector"{ print $6 }' file

如果有超过一个逗号,您也可以替换nr 6字段中的所有逗号,然后打印它。

代码语言:javascript
复制
awk '/blk_update_request/ && $7 =="sector"{ gsub(/,+/, "", $6); print $6 }' file

输出

代码语言:javascript
复制
sde
sde
sde
sde
sde

对于第二部分,您可以使用gsub将字符替换为空字符串,然后打印字段nr 8。

代码语言:javascript
复制
awk '{ gsub(/[():]+/, "", $8); print $8 }' file | sort -u

输出

代码语言:javascript
复制
dm-10
dm-11
dm-12
dm-13
dm-14
dm-15
票数 1
EN

Stack Overflow用户

发布于 2022-03-21 12:48:33

在显示的示例中,请尝试以下awk解决方案:

对于获得sde的第一个输出,请尝试遵循awk代码。

代码语言:javascript
复制
awk -F',|[[:space:]]+' '/blk_update_request/ && $(NF-1)=="sector" {print $(NF-3)}' Input_file

对于获得dm值的第二个输出,请尝试遵循awk代码。

代码语言:javascript
复制
awk -F"[)(]" '!arr[$2]++{print $2 | "sort -n"}' Input_file
票数 1
EN

Stack Overflow用户

发布于 2022-03-21 13:20:39

我将使用GNU AWK执行第二项任务,如下所示,让file.txt内容

代码语言:javascript
复制
Mar 20 05:15:02 transpire kernel: [15432418.855144] EXT4-fs (dm-13): error count since last fsck: 100
Mar 20 06:16:12 transpire kernel: [15436088.797185] EXT4-fs (dm-12): error count since last fsck: 20
Mar 20 07:17:22 transpire kernel: [15439758.736285] EXT4-fs (dm-15): error count since last fsck: 40
Mar 20 07:17:22 transpire kernel: [15439758.736293] EXT4-fs (dm-14): error count since last fsck: 2
Mar 20 19:48:50 transpire kernel: [15484846.579068] EXT4-fs (dm-11): error count since last fsck: 55
Mar 20 19:48:50 transpire kernel: [15484846.580064] EXT4-fs (dm-10): error count since last fsck: 41
Mar 21 05:16:49 transpire kernel: [15518924.611572] EXT4-fs (dm-13): error count since last fsck: 100
Mar 21 06:17:59 transpire kernel: [15522594.553205] EXT4-fs (dm-12): error count since last fsck: 20
Mar 21 07:19:09 transpire kernel: [15526264.495077] EXT4-fs (dm-14): error count since last fsck: 2
Mar 21 07:19:09 transpire kernel: [15526264.495086] EXT4-fs (dm-15): error count since last fsck: 4

然后

代码语言:javascript
复制
awk 'BEGIN{PROCINFO["sorted_in"]="@ind_str_asc";FPAT="dm-[[:digit:]]+"}NF{arr[$1]}END{for(i in arr){print i}}' file.txt

输出

代码语言:javascript
复制
dm-10
dm-11
dm-12
dm-13
dm-14
dm-15

说明:我通知GNU AWK使用索引作为字符串升序阵列导线,该字段是dm-,后面跟着1位或更多位数。NF是内建变量,表示字段的数目,当用作条件时,如果至少有一个字段出现在行中,则为真。在这种情况下,我确实提到了数组arr的那个字段。这确实会在该数组中创建这样的键,请注意,不必给出值。在处理完所有行之后,我按照print的顺序使用for.in的所有键。

(在gawk 4.2.1中测试)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71557484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档