2010-02-23 146 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))