2013-12-19 57 views
0

我需要使用shell腳本獲取txt文件的第n行。使用非交互式shell腳本獲取文本文件的第n行

我的文本文件就像

abc 
xyz 

我需要獲取二號線,並將其存儲在一個變量

我一直在使用類似的命令嘗試了所有組合:

  1. 的sed
  2. awk
  3. head

...等

問題是,當腳本被稱爲從終端,所有這些命令做工精細。 但是當我從我的java文件調用相同的shell腳本時,這些命令不起作用。

我想,它與非交互式shell有關。

請幫

PS:使用讀命令我能夠第一線存儲在一個變量。

read -r i<edit.txt 

這裏「i」是變量,edit.txt是我的txt文件。

但我無法弄清楚,如何獲得第二條線。

在此先感謝

編輯: 還腳本退出,當我使用這些「非工作」命令,將不執行剩餘的命令。

已經嘗試命令:

i=`awk 'N==2' edit.txt` 
i=$(tail -n 1 edit.txt) 
i=$(cat edit.txt | awk 'N==2') 
i=$(grep "x" edit.txt) 

Java代碼:

try 
    { 
     ProcessBuilder pb = new ProcessBuilder("./myScript.sh",someParam); 

     pb.environment().put("PATH", "OtherPath"); 

     Process p = pb.start(); 

     InputStreamReader isr = new InputStreamReader(p.getInputStream()); 
     BufferedReader br = new BufferedReader(isr); 

     String line ; 
     while((line = br.readLine()) != null) 
      System.out.println(line); 

     int exitVal = p.waitFor(); 
    }catch(Exception e) 
    { e.printStackTrace(); } 
} 

myscript.sh

read -r i<edit.txt 
echo "session is : "$i #this prints abc, as required. 

resFile=$(echo `sed -n '2p' edit.txt`) #this ans other similar commands donot do anything. 
echo "file path is : "$resFile 
+0

可能的重複:http://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file – SuperSaiyan

+0

我試過他的命令,它在終端中運行良好。但不是當從java程序調用腳本時。 – Singh

回答

2

一種有效的方法來從文件打印n行(特別適合於大文件):

sed '2q;d' file 

此sed命令在打印第2行後立即退出,而不是直到結束讀取文件。

要這些信息存儲在一個變量:

line=$(sed '2q;d' file) 

或使用行號的變量:

n=2 
line=$(sed $n'q;d' file) 

UPDATE:

Java代碼:

shell腳本:

f=$(dirname $0)/edit.txt 
read -r i < "$f" 
echo "session is: $i" 

echo -n "file path is: " 
sed '2q;d' "$f" 
+0

在終端中工作, ,但是當java程序調用相同的腳本時不能工作 – Singh

+0

您可以在您的問題中發佈您的Java代碼。 – anubhava

+0

添加了代碼片段 – Singh

0

試試這個:

tail -n+X file.txt | head -1 

其中X是行號:

tail -n+4 file.txt | head -1 

爲4號線。

+0

也可以使用較短的版本: tail -2 file.txt |頭-1 當然,你抓住輸出並存儲在一個變量: line = \'tail -2 file.txt |頭-1 \' –

+0

在終端工作, ,但不是當相同的腳本被java程序調用時 – Singh