2012-06-12 68 views
7

我有一個名爲email.txt像這樣的一個文件在我的bash腳本腳本命名MyScript可:的grep傳遞到一個變量在bash

#!/bin/bash 

file=$(myscript) 

var1=$(awk 'NR==2' $file) 

var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b')) 

echo $var2 

但我無法運行此script.When我運行這個命令手動在bash我能獲得的電子郵件地址:

echo $var1 | grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b' 

我需要把電子郵件地址存儲在一個變量,所以我可以在其他函數中使用它。可以有人告訴我如何解決這個問題? 謝謝。

+0

您是否試過'echo $ file'以確保'myscript'真的能夠從email.txt返回內容? – flesk

+0

@flesk yup..i've已經完成了。$文件有我想grep的確切的行和內容,它可以回顯沒有問題 –

+0

如果'From:'行不在第2行:'awk -F:'$ 1 ==「從」{print $ 2;退出}'「$文件」' –

回答

10

我認爲這是去了解事情的過於複雜的方式,但如果你只是想獲得你的腳本工作,試試這個:

#!/bin/bash 

file="email.txt" 

var1=$(awk 'NR==2' $file) 

var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b') 

echo $var2 

我不知道什麼是file=$(myscript)應該這樣做,但在下一行中,您需要一個文件名作爲參數awk,因此您應該將email.txt作爲字符串值分配給file,而不是執行名爲myscript的命令。 $var1不是命令(它只是你文本文件中的一行),所以你必須echo它給grep任何有用的工作。在grep附近的附加括號是多餘的。

+0

匹配部分時使用此解決方案它不會給我任何錯誤,但它當我回顯$ var2 –

+0

@ newbie.my時,不會給出輸出結果:在'$ var1'周圍添加雙引號。 – flesk

+0

我一直很傻,你的解決方案正在工作。因爲我在我的機器上使用不同的變量,所以變量名應該改變。無論如何感謝代碼! –

9

正在發生的事情是這樣的:

var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b')) 
     ^^^^^^^ Execute the program named (what is in variable var1). 

你需要做這樣的事情:

var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b') 

甚至

var2=$(awk 'NR==2' $file | grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b') 
+0

這個答案也是正確的。用更體面的step.Thanks! –

0

有很大的幫助標誌對於bash: - xv

var2=$("$var1" | (grep... 

應該

var2=$(echo "$var1" | (grep... 

也是我的grep版本沒有-o標誌。

而且,就grep模式而言,即使下面的代碼運行,grep模式也是「貪婪的」,它的輸出並不是你想要的。

#!/bin/bash -xv 
file=test.txt 
var1=$(awk 'NR==2' $file) 

var2=$(echo "$var1" | (grep -Ei '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+.[A-Z]{2,4}\b')) 

echo $var2 
+0

我已經嘗試過你的解決方案。但它不工作。順便說一句,我的grep有-o標誌。它用於顯示只與模式 –

0

使用Bash parameter expansion

var2="${var1#*:}" 
+1

這不是命令替換,命令替換是$(命令)。你所展示的是一種參數擴展的形式(有很多)。您正在移除以':'結尾的最短字符串 – cdarke

+0

@cdarke:是。+ 1 –

0

有一個較粗略的方式:

貓$文件| grep @ | tr'<>''\ 012 \ 012'| grep @

也就是說,用@符號提取行[s],將尖括號換成換行符,然後grep再次爲任何剩下的@符號。

根據需要進行優化...