如何使用 cut/awk/sed 命令将 select 作为 linux 中文件的记录

How use cut/awk/sed command to select as records from a file in linux

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

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

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

如何用cut命令实现?

awk '/^Name: XXX/,/^Serial Number:/ { print }' FILE

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

您文件的输出:

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

这绝对不能用 cut 完成,您可能需要考虑 perlrubypython 等语言。

使用 sed:

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

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

grep -B1 -A2 "Name: XXX"

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

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

# this will give the age of XXX
paste - - - - < details.txt | grep 'Name: XXX' | cut -f 3 | cut -f 2 -d:
$ cat tst.awk
BEGIN{ FS=": *"; OFS=": "; split(tgt,a); tgtTag=a[1]; tgtVal=a[2] }
{ tags[++numTags] = ; tag2val[] =  }
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