【发布时间】:2019-06-21 08:37:03
【问题描述】:
我在脚本中有这个命令:
find /home/* -type d -name dev-env 2>&1 | grep -v 'Permiso' >&2 > findPath.txt
这给了我这个回报:
/home/user/project/dev-env
我需要在“/”(用户)之间取第二个参数,以便稍后将其保存在变量中。我找不到获取“用户”文本的方法。
【问题讨论】:
我在脚本中有这个命令:
find /home/* -type d -name dev-env 2>&1 | grep -v 'Permiso' >&2 > findPath.txt
这给了我这个回报:
/home/user/project/dev-env
我需要在“/”(用户)之间取第二个参数,以便稍后将其保存在变量中。我找不到获取“用户”文本的方法。
【问题讨论】:
使用cut:
echo "/home/user/project/dev-env" | cut -d'/' -f3
结果:
user
这告诉cut 使用/ 作为分隔符并返回第三个字段。 (第一个字段是空白/空,第二个字段是home。)
使用awk:
echo "/home/user/project/dev-env" | awk -F/ '{print $3}'
这告诉awk 使用/ 作为字段分隔符并打印第三个字段。
【讨论】:
假设 grep 生成的路径始终是绝对路径:
second_component=$(find .... -type d -name dev-env 2>&1 | grep -v 'Permiso' | cut -d / -f 3)
但是,您的方法还存在其他几个问题:
您使用 /home/* 作为find 的起点。这只有在 /home 下只有一个子目录时才有效。不太可能发生的情况。
即便如此,它也只有在 grep 只产生一行时才有效。这是一个语义问题:如果你得到不止一行怎么办——你对哪一行感兴趣?假设你知道你总是对第一行感兴趣,你可以通过head -n 1 传递结果来解决这个问题。
接下来,您将 stderr 从 find 重定向到 stdout,这意味着来自 find 的任何错误都不会被注意到;你只会得到一些奇怪的结果。最好显示来自find 的任何错误消息,而是评估来自find 和grep 的退出代码。
【讨论】:
... | cut -d/ -f3
"第三个字段,用斜线分隔符"
【讨论】: