我有一个包含太多shell脚本代码的文件。在这里,我有一个字符串" / usr / bin / rsync"其输出如下
/usr/bin/rsync -arz --update --chmod=Du=rwx,Dg=rwx,Do=rwx,Fu=rwx,Fg=rw,Fo=rw -e "ssh -p 7887" root@192.168.1.201:/mnt/enjayvol1/remote/* /mnt/enjayvol5/esync/naspro/remote/ --bwlimit=0 --stats -h -l >> ${LOGFILE}
从这个字符串中,我想找到第一次和第二次出现时目前正在使用哪个enjayvol。
我需要输出,因为第一次出现的是 enjayvol1 ,第二次出现是 enjayvol5 。
我需要使用两个命令
预期产量是 对于第一个命令 的 enjayvol1
并且第二个命令输出是 enjayvol5
我用过
firstcommand=`grep -w "/usr/bin/rsync" esync.sh | grep -i enjayvol | head -1`
它将输出显示为
/usr/bin/rsync -arz --update --chmod=Du=rwx,Dg=rwx,Do=rwx,Fu=rwx,Fg=rw,Fo=rw /mnt/enjayvol1/lokesh/* -e "ssh -p 7887" root@192.168.1.201:/mnt/enjayvol5/esync/naspro/lokesh/ --bwlimit=0 --stats -h -l >> ${LOGFILE}
secondcommand=`grep -w "/usr/bin/rsync" esync.sh | grep -i enjayvol | tail -1`
它将输出显示为
/usr/bin/rsync -arz --update --chmod=Du=rwx,Dg=rwx,Do=rwx,Fu=rwx,Fg=rw,Fo=rw /mnt/enjayvol1/lokesh/* -e "ssh -p 7887" root@192.168.1.201:/mnt/enjayvol5/esync/naspro/lokesh/ --bwlimit=0 --stats -h -l >> ${LOGFILE}
答案 0 :(得分:2)
请问您可以尝试关注并告诉我这是否对您有所帮助(您可以通过单一命令实现此目的)。以下回答将提供所有具有enjayvol的字符串。
awk -v RS=" " '{match($0,/enjayvol[^/]*/);if(substr($0,RSTART,RLENGTH)){print substr($0,RSTART,RLENGTH)}}' Input_file
输出如下。
enjayvol1
enjayvol5
编辑:如果您要搜索/ usr / bin / rsync字符串,然后想要获取字符串enjaybol的所有匹配项,那么以下内容可能对您有帮助。
awk -v RS=" " '/${LOGFILE}/{val=""} /\/usr\/bin\/rsync/{val=1} val{match($0,/enjayvol[^/]*/);if(substr($0,RSTART,RLENGTH)){print substr($0,RSTART,RLENGTH)}}' Input_file
答案 1 :(得分:1)
grep
使用-o
开关(我已将grep
的输出用于以下示例中的文件file
。现实世界,您将grep
的输出管道传输到下面显示的grep
s):
$ grep -o enjayvol[^/]* file
enjayvol1
enjayvol5
如果输入中有两次以上的点击,您可以使用-m 2
开关将点击次数限制为仅为2次。
然后,如果在字符串中存在例如benjayvol1
(其中enjayvol
是子字符串),则上面会失败。我们可以使用PCRE和正向后看(如果可用)处理它:
$ grep -Po -m 2 "(?<=/)enjayvol[^/]*" file
有关上述开关的详细说明,请参阅man grep
。
答案 2 :(得分:0)
sed 解决方案: 所以你正在使用一个shell脚本,你将grep的输出放在vars firstcommand 和 secondcommand 中。忽略两个问题都具有相同值的事实,您正在寻找rsync的 src 和 dst 。另一种获取方法是使用 sed :
src=$(sed -E 's!.*(enjayvol(01?|1(01)?|5|6)).*(enjayvol(01?|1(01)?|5|6)).*!\1 \4!' \
<<< $firstcommand | cut -d' ' -f1)
和dst:
dst=$(sed -E 's!.*(enjayvol(01?|1(01)?|5|6)).*(enjayvol(01?|1(01)?|5|6)).*!\1 \4!' \
<<< $firstcommand | cut -d' ' -f2)
你已经编辑了你的问题,删除了enjayvol-directorynames(0,1,01,10,11,5,6)格式的要求,所以正则表达式可以简化为:
src=$(sed -E 's!.*(enjayvol[0-9]).*(enjayvol[0-9]).*!\1 \2!' \
<<< $firstcommand | cut -d' ' -f1)
如果需要,您可以对var secondcommand 执行相同的操作。
答案 3 :(得分:0)
$ awk -F'/' 'index($0,"/usr/bin/rsync") { for (i=1; i<=NF; i++) if ($i ~ /^enjayvol/) print $i }' file
enjayvol1
enjayvol5