2017-03-23 42 views
1

我對Linux比較陌生。並且已經收到了從文件中提取特定信息的任務。該文件是一個txt文件。它包含以下信息:如何根據僅匹配一行來提取文件的一部分?

Cache Info: #31 
Designation: "L1 Cache" 
Level: L1 
State: Enabled 
Mode: 0x00 (Write Through) 
Location: 0x00 (Internal, Not Socketed) 
ECC: 0x02 (Unknown) 
Type: 0x04 (Data) 
Associativity: 0x07 (8-way Set-Associative) 
Max. Size: 128 kB 
Current Size: 128 kB 
Supported SRAM Types: 0x0002 (Unknown) 
Current SRAM Type: 0x0002 (Unknown) 
Cache Info: #32 
Designation: "L1 Cache" 
Level: L1 
State: Enabled 
Mode: 0x00 (Write Through) 
Location: 0x00 (Internal, Not Socketed) 
ECC: 0x02 (Unknown) 
Type: 0x03 (Instruction) 
Associativity: 0x07 (8-way Set-Associative) 
Max. Size: 128 kB 
Current Size: 128 kB 
Supported SRAM Types: 0x0002 (Unknown) 
Current SRAM Type: 0x0002 (Unknown) 
Cache Info: #33 
Designation: "L2 Cache" 
Level: L2 
State: Enabled 
Mode: 0x00 (Write Through) 
Location: 0x00 (Internal, Not Socketed) 
ECC: 0x05 (Single-bit) 
Type: 0x05 (Unified) 
Associativity: 0x05 (4-way Set-Associative) 
Max. Size: 1024 kB 
Current Size: 1024 kB 
Supported SRAM Types: 0x0002 (Unknown) 
Current SRAM Type: 0x0002 (Unknown) 
Cache Info: #34 
Designation: "L3 Cache" 
Level: L3 
State: Enabled 
Mode: 0x01 (Write Back) 
Location: 0x00 (Internal, Not Socketed) 
ECC: 0x05 (Single-bit) 
Type: 0x05 (Unified) 
Associativity: 0x09 (12-way Set-Associative) 
Max. Size: 6144 kB 
Current Size: 6144 kB 
Supported SRAM Types: 0x0002 (Unknown) 
Current SRAM Type: 0x0002 (Unknown) 

我的任務就是以某種方式提取並打印到殼「緩存信息:#32」與它的所有信息。就像這樣:

Cache Info: #32 
Designation: "L1 Cache" 
Level: L1 
State: Enabled 
Mode: 0x00 (Write Through) 
Location: 0x00 (Internal, Not Socketed) 
ECC: 0x02 (Unknown) 
Type: 0x03 (Instruction) 
Associativity: 0x07 (8-way Set-Associative) 
Max. Size: 128 kB 
Current Size: 128 kB 
Supported SRAM Types: 0x0002 (Unknown) 
Current SRAM Type: 0x0002 (Unknown) 

我試過用cat /folder/file.txt | grep -i「緩存信息:」但我只得到第一行,沒有更多。

任何人都可以請幫我解決這個小問題嗎? *此外,我想指出,該文件是隨機的..它可以包含更多的數據或少得多。

+0

「grep」中的'-A'選項可能對您有幫助。檢查這篇文章:http://stackoverflow.com/questions/9081/grep-a-file-but-show-several-surrounding-lines。 – codeforester

+2

'-A'是固定數量的行,如果兩個'Cache Info'行之間的行數是固定的,這就足夠了。否則,你需要使用類似'awk'的東西。 – chepner

回答

1

使用grep您可以指定要提取的搜索詞彙中有多少條記錄「B」efore或「A」。如果記錄的數量始終是靜態的,這是超級快:

grep -A12 "#32" <yourfile> 

如果記錄的數量是可變的,你可以用awk:

awk '$1=="Cache" && $3!="#32" {recordFound=0} $1=="Cache" && $3=="#32" {recordFound=1} recordFound==1 {print $0}' <yourfile> 

awk將達到分裂每條記錄到各個領域。這將測試這些字段以查看我們是否處於「緩存」記錄以及該緩存記錄是否爲「#32」。它基於該搜索將名爲'recordFound'的變量設置爲true或false。如果該變量爲true,則打印該記錄。

+0

希望OP很容易看到awk命令中的錯字 - 它顯然不應該是「aawk」。 – unigeek

+0

是的,它的工作!非常感謝你。現在我看到真棒awk真棒。問題:如果讓我說我只會從同一個文件中的「Level:L1」搜索「Max Size」,那麼我會怎麼做呢? –

+0

我嘗試了這樣,但它沒有給出任何結果:awk'$ 1 ==「級別:」{recordFound == 1} recordFound == 1 {print $ 0}'file.txt | grep -i「max。size」 –

0

這是awk的,它是由是否有每個「緩存項」行之前的空行容易得多工作....所以插入一些空行:

sed '/^Cache Info/i 
' input | awk '$3 == "#32"' RS= 

戰略經濟對話就在那裏插入一個空行。需要空白行以便awk可以將每個緩存條目視爲一個獨特的記錄(通過在awk中取消設置RS,awk使用由空行而非單行分隔的記錄)。當記錄的第3個字段是字符串「#」 32「,awk打印該記錄。

相關問題