[英]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命令來實現?
您可以像這樣簡單地使用grep:
grep -B1 -A2 "Name: XXX"
-B1和-A2表示grep還應該在匹配之前打印一行,在匹配之后打印兩行。
$ 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
使用sed:
sed -n '$!N;/Name: XXX/{N;N;p;}' filename
paste
將允許您將記錄的所有字段放在同一行上(只要您的整個文件由每4行組成的記錄組成)。
# this will give the age of XXX
paste - - - - < details.txt | grep 'Name: XXX' | cut -f 3 | cut -f 2 -d:
awk '/^Name: XXX/,/^Serial Number:/ { print }' FILE
將打印/^Name: XX/
和/^Serial Number:/
之間的所有內容,包括
您的FILE的輸出:
Name: XXX
Age: 25
Sex: Male
Serial Number: 0xe
使用cut
絕對不能做到這一點,您可能需要考慮使用perl
, ruby
或python
這樣的語言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.