我试图从变量值'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
如上所述,假设vers
和sec
在您的示例输入中连续出现。
@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
(NF
awk
特殊变量为字段数)