首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用cut命令获取特定行?

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

Stack Overflow用户
提问于 2019-05-31 02:44:57
回答 2查看 3.1K关注 0票数 1

背景

我有一个名为yeet.d的文件,如下所示

代码语言:javascript
复制
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

我熟悉cut命令的f and d选项。f选项允许您指定要从中提取的列,而d选项允许您指定分隔符。

问题

我希望使用cut命令返回此输出。

代码语言:javascript
复制
/just/do/it

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

代码语言:javascript
复制
cut -f1 -d= yeet.d

假设我想把值放在等号的右边,用等号作为分隔符。但是,这将返回:

代码语言:javascript
复制
/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不同,因为我希望在一个大文件中选择一行,而不仅仅是靠近结尾或开头。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-31 03:08:10

这看起来更容易用awk来表达……

代码语言:javascript
复制
# 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

Bash位允许将

  • -v _something="Some Thing"变量传递给awk
  • $3 == _search位告诉awk仅当列3等于search字符串

时才匹配

代码语言:javascript
复制
- To search for a sub-string within a line one can use _`$0 ~ _search`_

  • {print $3}位告诉awkprint3中查找任何匹配的
  • ,而<<'EOF'位告诉Bash不要展开开始和结束EOF标记

中的任何内容

..。但是,上面的代码仍然会输出重复的匹配项,例如。如果yeet.d包含了..。

代码语言:javascript
复制
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...

代码语言:javascript
复制
_string='/just/do/it'
_path='yeet.d'

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

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

更新

要在打印第三列时在第一列上触发awk并在第一个匹配后退出,可能如下所示...

代码语言:javascript
复制
_string='SHIA_LEBEOUF'
_path='yeet.d'

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

..。更进一步的概括。

代码语言:javascript
复制
_string='^SHIA_LEBEOUF '
_path='yeet.d'

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

..。因为awk在很大程度上完全得到了正则表达式。

票数 2
EN

Stack Overflow用户

发布于 2019-05-31 03:06:34

这取决于您希望如何标识所需的行。

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

代码语言:javascript
复制
cut -f2 -d= yeet.d | sed '53q;d'

这段代码提取了第53行。

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

代码语言:javascript
复制
cut -f2 -d= yeet.d | grep just

这将提取包含单词just的所有行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56383950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档