如何使用 Awk / cut 获取“/”之间的文本?
How to take a text between "/" with Awk / cut?
我在脚本中有这个命令:
find /home/* -type d -name dev-env 2>&1 | grep -v 'Permiso' >&2 > findPath.txt
这给了我这个回报:
/home/user/project/dev-env
我需要在“/”(用户)之间获取第二个参数,以便稍后将其保存在变量中。我找不到只拿起 "user" 文本的方法。
... | cut -d/ -f3
"Third field, as cut by slash delimiter"
使用cut
:
echo "/home/user/project/dev-env" | cut -d'/' -f3
结果:
user
这告诉 cut
使用 /
作为分隔符,return 作为第三个字段。 (第一个字段是blank/empty,第二个字段是home
。)
使用awk
:
echo "/home/user/project/dev-env" | awk -F/ '{print }'
这告诉 awk
使用 /
作为字段分隔符并打印第 3 个字段。
假设 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
.
的退出代码
我在脚本中有这个命令:
find /home/* -type d -name dev-env 2>&1 | grep -v 'Permiso' >&2 > findPath.txt
这给了我这个回报:
/home/user/project/dev-env
我需要在“/”(用户)之间获取第二个参数,以便稍后将其保存在变量中。我找不到只拿起 "user" 文本的方法。
... | cut -d/ -f3
"Third field, as cut by slash delimiter"
使用cut
:
echo "/home/user/project/dev-env" | cut -d'/' -f3
结果:
user
这告诉 cut
使用 /
作为分隔符,return 作为第三个字段。 (第一个字段是blank/empty,第二个字段是home
。)
使用awk
:
echo "/home/user/project/dev-env" | awk -F/ '{print }'
这告诉 awk
使用 /
作为字段分隔符并打印第 3 个字段。
假设 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
.