【问题标题】:How do I obtain a specific row with the cut command?如何使用 cut 命令获取特定行?
【发布时间】:2019-05-30 18:44:56
【问题描述】:

背景

我有一个名为 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

我熟悉cut 命令的f and d 选项。 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 命令返回only /just/do/it,而不是从上述情况返回?这与How to get second last field from a cut command 不同,因为我想在一个大文件中选择一行,而不仅仅是靠近结尾或开头。

【问题讨论】:

    标签: cut


    【解决方案1】:

    这看起来用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 任何匹配项

    • &lt;&lt;'EOF' 位告诉 Bash 不要在打开和关闭 EOF 标签中展开任何内容p>

    ...但是,上面仍然会输出重复的匹配项,例如。如果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 告知print 之后将其告知exit。 ..

    _string='/just/do/it'
    _path='yeet.d'
    
    awk -v _s="${_string}" '$3 == _s {print $3; exit}' "${_path}"
    

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


    更新

    tripawk 在第一列上打印第三列并在第一次匹配后退出可能看起来像...

    _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。但是,在我的上下文中,我真的只知道左侧(SHIA_LEBEOUF)并且想要获得右侧。 @flappix 的答案包含一种更通用的方法。
    • 感谢@isakbob 的反馈,我已经更新了我的答案,希望能告诉你awk 是值得研究的。有一个完整的scripting 语言可用,因此随着项目的增长,有可能制作可重用的位......这甚至没有涉及通过将awk 纳入工作流程可以运行多快......让我们知道awk 问题如果你卡在一些边缘情况下,如果你愿意,可以标记我,因为有时很难找到关于这些事情的最新文档。
    【解决方案2】:

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

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

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

    这会提取第 53 行。

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 2019-05-06
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多