如何使用 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
完成,您可能需要考虑 perl
、ruby
或 python
等语言。
使用 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
我有一个文件 (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
完成,您可能需要考虑 perl
、ruby
或 python
等语言。
使用 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