【发布时间】:2018-07-12 02:33:44
【问题描述】:
我有一个返回输出的命令:
$ show
file 1 banana
file 3 apple
file 2 watermelon
file 0 tomato
file name 0=abc 1=def
2=ghi 3=jkl
使用给定的文件名,我想找到相关的单词。例如,ghi 将匹配 watermelon。
我可以将文件号与sed 匹配并重复使用结果:
$ filenum=$(show | sed -n 's/.*\<\([0-9]*\)=ghi\>.*/\1/p')
$ show | sed -n 's/file '"$filenum"' \([a-z]*\)/\1/p'
watermelon
show 的输出计算起来可能很长,所以我想避免调用它两次。也可以将输出存储在一个变量中并做同样的事情:
$ out=$(show)
$ filenum=$(echo "$out" | sed -n 's/.*\<\([0-9]*\)=ghi\>.*/\1/p')
$ echo "$out" | sed -n 's/file '"$filenum"' \([a-z]*\)/\1/p'
watermelon
但我想用最少的命令来做到这一点。
仅调用sed、awk 或任何类似实用程序是否可以达到相同的结果?
编辑我想要一个命令magic-command,对于给定的文件名,在show 命令的输出中打印相关的单词。例如:
$ show | magic-command "ghi"
watermelon
$ show | magic-command "abc"
tomato
$ show | magic-command "def"
banana
show 命令的格式如下:
file <filenum> <word>
...
file name <filenum>=<filename> ...
编辑 2
感谢您的回答,我以前从未使用过awk,所以感谢您,我学到了很多东西!所以我对它们进行了修补,最终得到了以下结果:
$ cat magic-command.sh
#!/bin/sh
awk '
# Match the `<filenum>=<filename>` using the given <filename>
# to find to <filenum>
match($0, /([0-9]*)='"$1"'/, out ) {
filenum=out[1]
}
# Fill n2name using the `file <filenume> <word>` lines
/\<file [0-9]*\>/ {
n2name[$2]=$3
}
END {
print n2name[filenum]
}'
然后:
$ show | ./magic-command.sh "ghi"
watermelon
【问题讨论】:
-
欢迎来到 SO,这是
file name 0=abc 1=def 2=ghi 3=jkl是一个 shell 变量吗?你能详细说明一下吗? -
@RavinderSingh13 谢谢!
file name 0=abc 1=def 2=ghi 3=jkl是show命令输出的一部分。第一个代码块中除了第一行之外的所有内容都是show的输出。 -
如果给定的解决方案对您有用,请告诉我?