grep查找字符串的第一个内容和第二个内容

时间:2017-10-02 05:44:46

标签: bash sed grep cut

我有一个包含太多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}

4 个答案:

答案 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