2016-09-14 51 views
1

我對grep,cut,sed等相當不錯。但是,我很難從文件中提取這些數據。它看起來像這樣:如果線匹配任何字符串後,然後執行命令

--timestamp-- data://example1// -----| This could be anything or nothing 
--timestamp-- data://example2// -----|  This could be something 
--timestamp-- data://example3// -----| 
--timestamp-- data://example4// -----|  This could something else 
--timestamp-- data://example5// -----| This could be another something 
--timestamp-- data://example6// -----| 
--timestamp-- data://example7// -----|  This could something else 

我想返回字符串-----|後有什麼都行,以便輸出將是:

example1 
example2 
example4 
example5 
example7 

我知道我需要使用基於一個IF語句在grep '-----|.*$'比賽。如果字符串後面有任何字符,則輸出該行。然後,我可以管道一個awk命令,該命令將在示例前後的分隔符//之間提取。我只是堅持如何構建if語句。

任何與此IF聲明的幫助將不勝感激。

+0

不需要'if',grep(或者兩個)就足夠了。 – redneb

+0

「之後有所有行」,你的意思是「以後沒有任何東西的所有行」? – redneb

+0

對不起,剛更新了這個問題。我以後肯定想要任何東西。 – DomainsFeatured

回答

1

您可以使用awk來做到這一點使用//作爲字段分隔符並打印第二場:

awk -F'//' '/-{5}\|[ \t]*[^ \t]/{print $2}' file 

example1 
example2 
example4 
example5 
example7 

正則表達式:/-{5}\|[ \t]*[^ \t]/搜索五虛線後面是文字管後跟0或多個空格,然後非空白字符。

您還可以使用POSIX類[[:blank:]]匹配一個空格或標籤:

awk -F'//' '/-{5}\|[[:blank:]]*[^[:blank:]]/{print $2}' file 
+1

Hey Anubhava,第二個POSIX班級看起來不錯。多測試一下。 – DomainsFeatured

+0

'[[:blank:]] *'可以是'。*'。 –

+0

是的,它可以但性能明智'[[:blank:]] *'會更好,沒有任何回溯。 – anubhava

0

在您的示例數據有後的空間| (或者可能只是複製的人工產物)。如果這些不是真的存在,只要將模式從/\| .+$/更改爲/\|.+$/ - 刪除空格。

這匹配所有在'| '組合:

$ awk -F/ '!/\| .+$/ {print $3}' < t 
example3 
example6 

這匹配所有在'| 「組合:

$awk -F/ '/\| .+$/ {print $3}' < t 
example1 
example2 
example4 
example5 
example7 
1

我會用一個grep做到這一點:

grep -oP '[^/]*(?=// -----\| .+$)' input.txt 

example1 
example2 
example4 
example5 
example7 

的想法是匹配從文本到行尾的/一路之間開始。我使用-o標誌,它只返回每行的匹配部分。這很好地與前瞻(即(?=...)部分)相匹配,它與其內部的模式相匹配,但不包含輸出中的匹配文本。

1
$ awk -F'/' '!/\|$/{print $3}' file 
example1 
example2 
example4 
example5 
example7 

,如果你想彷彿根本不存在治療|後的空格使病情/\|[[:blank:]]*$/

注意,這種方法將無法給出這樣一行:

--timestamp-- data://example1// -----| "anything" includes | 

如果可能發生,然後將其包含在你的榜樣。你可以改變以匹配-----|的條件被同樣有資格作爲「東西」:

--timestamp-- data://example1// -----| "anything" includes -----| 

等仍可能導致失敗。只要準確和真實地代表您的樣本輸入/輸出,並且包括最糟糕的情況,而不僅僅是晴天的情況。

+1

謝謝埃德。對不起,我無法提供更多細節。我選擇的答案確實爲我解決了這個問題。我欣賞幫助。很多榮譽。 – DomainsFeatured

+0

當然,但還有其他可能的情況下,它不會照顧取決於「什麼」的真正含義,可能有一個更簡單的解決方案,也取決於「什麼」的真正含義。 –

0

這裏是另一個awk

$ awk -F'-----\\|' '$2~/[^ ]+$/{n=split($1,a,"//"); print a[n-1]}' file 

example1 
example2 
example4 
example5 
example7 

這種處理額外的分隔符的情況下。

相關問題