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

How do I obtain a specific row with the cut command?

背景

我有一个名为 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 options of the cut 命令。 f 选项允许您指定要从中提取的列,而 d 选项允许您指定分隔符。

问题

我想要此输出 return 使用 cut 命令编辑。

/just/do/it

据我所知,这是我要输入的命令的一部分:

cut -f1 -d= yeet.d

鉴于我想要等号右边的值,以等号作为分隔符。然而,这将 return:

/steel/beams
/michael/jackson
....50 rows later....
/just/do/it
....73 rows later....
/very/hungry
/give/you/up

这比我想要的还要多。

问题

如何使用 cut 命令来 return /just/do/it 而不是上述情况?这与 How to get second last field from a cut command 不同,因为我想 select 一个大文件中的一行,而不仅仅是靠近末尾或开头。

这取决于您要如何识别所需的行。

您可以通过行号来识别它。在这种情况下,您可以使用 sed

cut -f2 -d= yeet.d | sed '53q;d'

这将提取第 53 行。

或者您可以通过关键字来识别它。在这种情况下使用 grep

cut -f2 -d= yeet.d | grep just

这将提取所有包含单词 just.

的行

这看起来用awk来表达会更容易...

# awk -v _s="${_string}" ' == _s {print }' "${_path}"

## Above could be more _scriptable_ form of bellow example

awk -v _search="/just/do/it" ' == _search {print }' <<'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

  • == _search 位告诉 awk 仅当列 3 等于 search 字符串

    • 要在一行中搜索 sub-string,可以使用 [=22=] ~ _search
  • {print } 位告诉 awkprint3 任何匹配项

  • 并且 <<'EOF' 位告诉 Bash 在打开和关闭 EOF标签

...但是,上面的仍然会输出重复的匹配项,例如。如果 yeet.d 以某种方式包含...

JET_FULE = /steal/beams
SHIA_LEBEOUF = /just/do/it
NEVER_GONNA = /give/you/up
AGAIN = /just/do/it

... awk.

会输出两行 /just/do/it

最快的解决方法是将 | 传送到 head -1,但是 更好的 方法是将 awk 传送到 exit 被告知 print...

_string='/just/do/it'
_path='yeet.d'

awk -v _s="${_string}" ' == _s {print ; exit}' "${_path}"

...虽然现在假设只需要第一个匹配项,但获得 nth 是可能的,尽管目前不在问题范围内上次阅读。


更新

trip awk 在第一列打印第三列并在第一个匹配后退出可能看起来像...

_string='SHIA_LEBEOUF'
_path='yeet.d'

awk -v _s="${_string}" ' == _s {print ; exit}' "${_path}"

...并进一步概括...

_string='^SHIA_LEBEOUF '
_path='yeet.d'

awk -v _s="${_string}" '[=14=] ~ _s {print ; exit}' "${_path}"

...因为awk 完全获取正则表达式,大部分.