首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用awk打印第二列,其余的文本从#

使用awk打印第二列,其余的文本从#
EN

Unix & Linux用户
提问于 2019-05-02 15:34:29
回答 4查看 2.6K关注 0票数 0

我的配置文件里有这样的行,

代码语言:javascript
运行
复制
bindsym $mod+F2 exec gnome-terminal #Open terminal 
bindsym $mod+p exec command /some/path"  #Popup Dictionary  
bindsym $mod+Mod1+l exec --no-startup-id /some/path/command #Dmenu for my books collection
bindsym Mod1+Control+b exec rxvt -e nnn #nnn file browser

我想awk出第二列和#后面的内容。我使用awk作为

代码语言:javascript
运行
复制
awk '/bindsym/{print $2}' filename

不过,我不知道如何在#之后获得文本。首选输出是键,然后是注释文本,如

代码语言:javascript
运行
复制
$mod+F2 Open terminal 
EN

回答 4

Unix & Linux用户

回答已采纳

发布于 2019-05-02 16:18:25

代码语言:javascript
运行
复制
$ awk -v OFS='\t' '/^bindsym/ { key = $2; sub(".*#", ""); print key, $0 }' file
$mod+F2 Open terminal
$mod+p  Popup Dictionary
$mod+Mod1+l     Dmenu for my books collection
Mod1+Control+b  nnn file browser

这使用awk首先提取每行上的第二个字段,从bindsym开始到变量key中。然后删除行中的所有内容,包括行中的#,并打印key和行中剩余的内容,并以制表符作为分隔符。

替代输出格式:

代码语言:javascript
运行
复制
$ awk '/^bindsym/ { key = $2; sub(".*#", ""); printf("%-20s\t%-20s\n", key, $0) }' file
$mod+F2                 Open terminal
$mod+p                  Popup Dictionary
$mod+Mod1+l             Dmenu for my books collection
Mod1+Control+b          nnn file browser

逻辑是相同的,但是输出为两个字段(左对齐)中的每个字段分配20个字符,并在它们之间放置一个制表符(以获得良好的度量)。

票数 2
EN

Unix & Linux用户

发布于 2019-05-02 16:23:14

使用GNU awkmatch()函数来匹配从#到行尾的部分

代码语言:javascript
运行
复制
awk '/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}' filep

match()函数使用第二个参数中正则表达式中匹配的模式填充第三个参数中提供的数组。

在任何POSIX awk上,都不支持match()的第三个参数,而是一对特殊变量RSTARTRLENGTH,它们标志着匹配组的开始和长度。我们使用当前行上的substr()函数来获得匹配的字符串

代码语言:javascript
运行
复制
awk '/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}' file

要漂亮地打印输出,可以像在另一个答案中一样使用printf()函数。

票数 2
EN

Unix & Linux用户

发布于 2019-06-11 20:24:40

sed中这样做非常简单;因为您的数据并不是真正面向字段的Awk,所以这里没有提供很大的好处:

代码语言:javascript
运行
复制
sed 's/^[^ ]* //;s/ .*#//' inputfile

翻译:

代码语言:javascript
运行
复制
s/^[^ ]* //

删除到并包括第一个空格字符的所有内容。

代码语言:javascript
运行
复制
s/ .*#//

删除第一个(剩余)空格字符中的所有内容,直到行上的最后一个#字符。

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

https://unix.stackexchange.com/questions/516796

复制
相关文章

相似问题

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