从一行中提取多个具有可变值的匹配词

  • 本文关键字:一行 提取 linux bash scripting
  • 更新时间 :
  • 英文 :


我试图从变量值'3.0 &ntlmssp",

更= 3.0秒= ntlmssp

~$ echo $cifs
//192.168.10.11/cifs_share on /cifs_share type cifs (rw,relatime,vers=3.0,sec=ntlmssp,cache=strict,username=testuser,domain=LAB,uid=30100,forceuid,gid=2050,forcegid,addr=192.168.10.11,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=4194304,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1)

我正在寻找这样的输出,

cifs_version : 3.0, Security : ntlmssp 

我能够提取一个单词vers,但如何提取2个单词(vers,sec)和重命名?

~$ echo $cifs|grep -o 'vers=[^ ,]+'
vers=3.0

我如何提取这个,请帮助,

谢谢,

使用任何sed:

$ sed 's/.*,vers=([^,]*),sec=([^,]*).*/cifs_version : 1, Security : 2/' file
cifs_version : 3.0, Security : ntlmssp

如上所述,假设verssec在您的示例输入中连续出现。

@vijayedm:从这里开始,它应该是微不足道的

mawk 'NF*=!_<NF' RS='[,() ]+' FS== OFS=' : '
vers : 3.0
sec : ntlmssp
cache : strict
username : testuser
domain : LAB
uid : 30100
gid : 2050
addr : 192.168.10.11
file_mode : 0755
dir_mode : 0755
rsize : 4194304
wsize : 4194304
bsize : 1048576
echo_interval : 60
actimeo : 1
gawk 'NF *= NR < NF*NF' FS== OFS=' : ' RS='^[^(]+[^=]+,|[,() ]+' 
vers : 3.0
sec : ntlmssp

或者如果你想让它们排成一行而不做额外的工作:

OFS='rtt: ' 
vers            : 3.0
sec             : ntlmssp
cache           : strict
username        : testuser
domain          : LAB
uid             : 30100
gid             : 2050
addr            : 192.168.10.11
file_mode       : 0755
dir_mode        : 0755
rsize           : 4194304
wsize           : 4194304
bsize           : 1048576
echo_interval   : 60
actimeo         : 1
OFS='frt'
vers
3.0
sec
ntlmssp
cache
strict
username
testuser
domain
LAB
uid
30100
gid
2050
addr
192.168.10.11
file_mode
0755
dir_mode
0755
rsize
4194304
wsize
4194304
bsize
1048576
echo_interval
60
actimeo
1

With plainbash:

~$ cifs='//192.168.10.11/cifs_share on /cifs_share type cifs (rw,relatime,vers=3.0,sec=ntlmssp,cache=strict,username=testuser,domain=LAB,uid=30100,forceuid,gid=2050,forcegid,addr=192.168.10.11,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=4194304,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1)'
~$ set -f; IFS='(,)=' arr=( $cifs ); set +f; v=""; s=""
~$ for((i=0;i<${#arr[@]};i++)); do
[[ ${arr[i]} == "vers" ]] && v="${arr[i+1]}"
[[ ${arr[i]} == "sec" ]] && s="${arr[i+1]}"
done
~$ printf 'cifs_version : %s, Security : %sn' "$v" "$s"
cifs_version : 3.0, Security : ntlmssp

set -f; IFS='(,)=' arr=( $cifs ); set +f禁用路径名扩展(set -f),将输入字符串赋给bash数组arr,输入字段分隔符(变量IFS)设置为括号、逗号和等号,并重新启用路径名扩展(set +f)。arr数组的元素现在是输入字符串的不同部分。

循环只是对数组的所有元素进行循环。当找到vers元素时,我们将下一个元素赋值给v,当找到sec元素时,我们将下一个元素赋值给变量s

printf打印您想要的输出字符串。

与任何awk:

~$ awk -F'[(,)=]' '{
for(i=1;i<=NF;i++) {
if($i == "vers") v=$(i+1)
if($i == "sec") s=$(i+1)
}
} END {
printf("cifs_version : %s, Security : %sn", v, s)
}' <<< "$cifs"
cifs_version : 3.0, Security : ntlmssp

它与普通bash解决方案完全相同,但采用awk脚本的形式。在awk中,输入字段分隔符可以用-F选项指定为正则表达式。在本例中,我们指定用括号、逗号或等号分隔字段。不同的字段为$1 ... $NF(NFawk特殊变量为字段数)

相关内容

  • 没有找到相关文章

最新更新