awk在print之前怎么去掉field头尾的空格?

linux shell awk by Xudong Zhang @ 2015-11-04 10:15:11

比如,我有一个命令的原始输出如下:

# zypper se -s qemu-kvm
S | Name | Type | Version | Arch | Repository        
--+----------+---------+-----------------------+--------+------------------- 
v | qemu-kvm | package | 2.4.0-310.3 | x86_64 | 13.2-virtulization
v | qemu-kvm | package | 2.4.0-310.3 | i586   | 13.2-virtulization
v | qemu-kvm | package | 2.1.3-7.2   | x86_64 | 13.2-update       

我想输出的结果是类似于qemu-kvm_Version_Arch.我用下面的命令:

# zypper se -s qemu-kvm | awk -F'|' '/kvm/ {print $2 "_" $4 "_" $5}'

得到结果:

 qemu-kvm _ 2.4.0-310.3 _ x86_64 
 qemu-kvm _ 2.4.0-310.3 _ i586   
 qemu-kvm _ 2.1.3-7.2   _ x86_64 

该怎么去掉$2,$4,$5首尾的空格呢?


可以这样

# zypper se -s qemu-kvm | awk -F'|' '/kvm/ {gsub(/ +/,"",$0);print $2 "_" $4 "_" $5}'

起作用的就是print前的那个gsub(/ +/,"",$0),去掉当前行的所有的空格字符.

####gsub(regexp, replacement, target)

gsub有3个参数,在第三个参数里查找所有能匹配第一个正则的字符串,然后替换为第二个参数.它的匹配是贪婪式的,也就是尽可能匹配最长的.

gsub是匹配所有match上的,sub()只匹配第一个match上的.

Attention: 最开始那个用的那个gsub(/ +/,"",$0)有个问题,它会替换掉所有的空格,也就是假设$4= 2.4.0 310.3这样的,替换后就变成了$4=2.4.0310.3,可能中间的那个空格我们不希望替换掉.

如果我们只想获取$2,去掉首尾字符串,严谨的写法如下

$awk -F'|' '{gsub(/^[ \t]+/,"",$2);gsub(/[ \t]+$/,"",$2);print $2}' input.txt

^是匹配开头,[ \t]是空格或者TAB,+是一个或者多个,$是匹配结尾.

by Xudong Zhang @2015-11-04 11:11:30.073 +0800 CST


我来回答

Markdown格式技巧

  • 行尾添加2个空格或者添加一个空行就能换行
  • 斜体: *hello* 或者 _world_
  • 加粗: **hello** 或者 __world__
  • 代码块: 添加空行,然后代码缩进4个空格
  • 特殊字符: 用\避免转义;\*就是*本身
  • python: `__name__`可以以代码形式输出__name__
  • 一个简单的例子

切换到移动版