【问题标题】:How use cut/awk/sed command to select as records from a file in linux如何使用 cut/awk/sed 命令从 linux 中的文件中选择记录
【发布时间】:2015-12-26 20:33:50
【问题描述】:

我有一个文件(details.txt),其内容格式如下。

Serial Number: 0xf
Name: XXX
Age: 25
Sex: Male
Serial Number: 0xe
Name: YYY
Age: 27
Sex: FeMale

我想检索姓名为“XXX”的人的完整记录

cut命令如何实现?

【问题讨论】:

  • 如果有的话,绝对不容易。你为什么要剪裁?为什么不使用 awk?
  • 你想用complete record做什么?
  • 当我请求 XXX 时,我的脚本不应该返回 YYY 的年龄。我询问和获取的参数在运行时会有所不同。
  • 发布预期输出以配合您的示例输入。

标签: linux bash awk sed cut


【解决方案1】:
awk '/^Name: XXX/,/^Serial Number:/ { print }' FILE

将打印/^Name: XX//^Serial Number:/ 之间的所有内容,包括

文件的输出:

Name: XXX
Age: 25
Sex: Male
Serial Number: 0xe

cut 绝对无法做到这一点,您可能需要考虑使用像 perlrubypython 这样的语言。

【讨论】:

  • 这不起作用。我试过 cat details.txt | awk '/^Name: XXX/,/^Serial Number:/ { print }' result.txt result.txt 为空
  • @KurinchiMalar awk '/^Name: XXX/,/^Serial Number:/ { print }' details.txt > result.txt
  • 如果我只输入年龄怎么办?我想要基于无顺序排序的整个记录​​。它应该类似于选择性查询。
  • 然后您需要将记录存储在数据结构中(例如,哈希)。 awk 确实有哈希值。检查grymoire.com/Unix/Awk.html
  • 然后在 awk (grymoire.com/Unix/Awk.html) 中使用哈希,或者将数据转换为更容易在 awk 中使用的表格结构。
【解决方案2】:

使用 sed:

sed -n '$!N;/Name: XXX/{N;N;p;}' filename

【讨论】:

  • 如果我输入 "Age:25" 会起作用吗? 0xf 的整个记录​​是预期的。
  • 你能解释一下这个答案吗?
  • @KurinchiMalar:不。你的问题是关于按名称搜索,这会提取包含Name: XXX 的整个记录​​。您想按姓名、年龄、序列号还是什么来搜索?
  • @RickSmith:很简单,它说“不要打印所有内容,记录最后一行,如果您看到“名称:XXX”,则再抓取两行并打印整个记录。跨度>
【解决方案3】:

你可以像这样简单地使用 grep:

grep -B1 -A2 "Name: XXX"

-B1 和 -A2 表示 grep 还应该在匹配之前打印一行,在匹配之后打印两行。

【讨论】:

  • 这是一个绝妙的答案!像魅力一样工作。
【解决方案4】:

paste 将允许您将记录的所有字段放在同一行(只要您的整个文件由每 4 行的记录组成)。

# this will give the age of XXX
paste - - - - < details.txt | grep 'Name: XXX' | cut -f 3 | cut -f 2 -d:

【讨论】:

    【解决方案5】:
    $ cat tst.awk
    BEGIN{ FS=": *"; OFS=": "; split(tgt,a); tgtTag=a[1]; tgtVal=a[2] }
    { tags[++numTags] = $1; tag2val[$1] = $2 }
    numTags == 4 {
        if (tag2val[tgtTag] == tgtVal) {
            for (tagNr=1; tagNr<=numTags; tagNr++) {
                tag = tags[tagNr]
                print tag, tag2val[tag]
            }
        }
        numTags = 0
    }
    

    .

    $ awk -v tgt="Name:XXX" -f tst.awk file
    Serial Number: 0xf
    Name: XXX
    Age: 25
    Sex: Male
    
    $ awk -v tgt="Age:25" -f tst.awk file
    Serial Number: 0xf
    Name: XXX
    Age: 25
    Sex: Male
    
    $ awk -v tgt="Age:27" -f tst.awk file
    Serial Number: 0xe
    Name: YYY
    Age: 27
    Sex: FeMale
    
    $ awk -v tgt="Sex:FeMale" -f tst.awk file
    Serial Number: 0xe
    Name: YYY
    Age: 27
    Sex: FeMale
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-05
      • 2017-12-23
      • 2021-03-29
      • 2020-06-19
      • 1970-01-01
      • 2012-09-22
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多