我有一个名为yeet.d
的文件,看起来像这样
JET_FUEL = /steel/beams
ABC_DEF = /michael/jackson
....50 rows later....
SHIA_LEBEOUF = /just/do/it
....73 rows later....
GIVE_FOOD = /very/hungry
NEVER_GONNA = /give/you/up
我熟悉f and d
命令的cut
选项。 f
选项允许您指定要从中提取的列,而d
选项可以指定哪些分隔符。
我希望使用cut
命令返回此输出。
/just/do/it
据我所知,这是我要输入的命令的一部分:
cut -f1 -d= yeet.d
考虑到我想要等号右边的值,以等号作为分隔符。但这会返回:
/steel/beams
/michael/jackson
....50 rows later....
/just/do/it
....73 rows later....
/very/hungry
/give/you/up
比我想要的还要多。
如何使用cut
命令仅返回 /just/do/it
,而不返回上述情况?这与How to get second last field from a cut command不同,因为我想在大文件中选择一行,而不仅仅是从结尾或开头开始。
答案 0 :(得分:2)
使用awk
...
# awk -v _s="${_string}" '$3 == _s {print $3}' "${_path}"
## Above could be more _scriptable_ form of bellow example
awk -v _search="/just/do/it" '$3 == _search {print $3}' <<'EOF'
JET_FULE = /steal/beams
SHIA_LEBEOUF = /just/do/it
NEVER_GONNA = /give/you/up
EOF
## Either way, output should be similar to
## /just/do/it
-v _something="Some Thing"
位允许将Bash变量传递给awk
$3 == _search
位告诉awk
仅在列3
等于search
字符串时才匹配
$0 ~ _search
{print $3}
位告诉awk
到print
列3
进行任何匹配
<<'EOF'
位告诉Bash不要在 EOF
标签的开头和结尾处扩展任何内容
...但是,以上内容仍将输出重复的匹配项,例如。如果yeet.d
以某种方式包含...
JET_FULE = /steal/beams
SHIA_LEBEOUF = /just/do/it
NEVER_GONNA = /give/you/up
AGAIN = /just/do/it
... /just/do/it
输出了两行awk
。
最快的解决方法是将|
传送到head -1
,但是更好的方法是在之后将awk
传送到exit
有人告诉print
...
_string='/just/do/it'
_path='yeet.d'
awk -v _s="${_string}" '$3 == _s {print $3; exit}' "${_path}"
...尽管现在假设只需要第一个匹配项,但由于上次阅读时当前不在问题范围内,因此有可能获得 n
。 / p>
在打印第三列时在第一列上行程 awk
,并在第一场比赛后退出...
_string='SHIA_LEBEOUF'
_path='yeet.d'
awk -v _s="${_string}" '$1 == _s {print $3; exit}' "${_path}"
...并进一步推广...
_string='^SHIA_LEBEOUF '
_path='yeet.d'
awk -v _s="${_string}" '$0 ~ _s {print $3; exit}' "${_path}"
...,因为awk
完全获得了正则表达式,主要是。
答案 1 :(得分:1)
这取决于您要如何识别所需的行。
您可以通过行号识别它。在这种情况下,您可以使用sed
cut -f2 -d= yeet.d | sed '53q;d'
这将提取第53行。
或者您可以通过关键字来识别它。在这种情况下,请使用grep
cut -f2 -d= yeet.d | grep just
这将提取所有包含单词 just 的行。