如何使用cut命令获取特定行?

时间:2019-05-30 18:44:57

标签: cut

背景

我有一个名为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不同,因为我想在大文件中选择一行,而不仅仅是从结尾或开头开始。

2 个答案:

答案 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} 位告诉awkprint3进行任何匹配

  • <<'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 的行。