2010-02-23 184 views
0

我試圖讓這個腳本基本上從命令行上的文件讀取輸入,使用grep匹配文件中的用戶標識,並輸出這些行的行號從1)開始......在新文件中。Bash腳本的幫助

到目前爲止我的劇本是這樣的

#!/bin/bash 
linenum=1 
grep $USER $1 | 
while [ read LINE ] 
do 
echo $linenum ")" $LINE >> usrout 
$linenum+=1 
done 

當我運行它./username file 我得到

line 4: [: read: unary operator expected 

任何人都可以解釋這個問題給我嗎?

謝謝

+0

'((linenum + = 1))' – 2010-02-23 18:40:28

回答

3

只需刪除[]周圍read line - 他們應該被用來進行測試(文件存在,字符串爲空等)。

+0

我剛剛發現了這一點,謝謝 – KP65 2010-02-23 15:52:06

1

離開方括號。

while read line; do 
    echo $linenum ")" $LINE 
done >> usrout 
+0

錯過亞麻布增量:) – vladr 2010-02-28 02:24:12

3

以下情況如何?

$ grep $USER file | cat -n >usrout
1

只用awk

awk -vu="$USER" '$0~u{print ++d") "$0}' file 

grep $USER file |nl 

或與外殼,(無需使用grep)

i=1 
while read -r line 
do 
case "$line" in 
    *"$USER"*) echo $((i++)) $line >> newfile;; 
esac 
done <"file" 
0

爲什麼不直接使用的grep-n(或- 行號)切換?

$ grep -n ${USERNAME} ${FILE} 

-n開關給出的匹配的文件中找到的行號。可以從grep的手冊頁:

-n, --line-number 
     Prefix each line of output with the 1-based line number 
     within its input file. 

所以,運行這個針對Linux的用戶test_user的/ etc/passwd文件,給出了:

31:test_user:x:5000:5000:Test User,,,:/home/test_user:/bin/bash 

這表明,出現在第31行的test_user帳戶/ etc/passwd文件。

0

此外,而不是$foo+=1,你應該寫foo=$(($foo+1))