帮助Bash脚本

时间:2010-02-23 15:47:58

标签: bash unix shell

我正在尝试让这个脚本基本上从命令行上的文件中读取输入,使用grep匹配文件中的用户ID,并使用从1开始的行号输出这些行... ... n in new文件。

到目前为止,我的脚本看起来像这样

#!/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

有人可以向我解释这个问题吗?

感谢

6 个答案:

答案 0 :(得分:3)

只需删除read line周围的[] - 它们应该用于执行测试(文件存在,字符串为空等)。

答案 1 :(得分:3)

以下情况如何?

$ grep $USER file | cat -n >usrout

答案 2 :(得分:1)

不要使用方括号。

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

答案 3 :(得分:1)

只需使用awk

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

grep  $USER file |nl

或使用shell,(不需要使用grep)

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

答案 4 :(得分:0)

为什么不将 grep -n (或 - line-number )开关一起使用?

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

-n 开关提供在文件中找到匹配项的行号。从grep的手册页:

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

因此,针对用户test_user对linux / etc / passwd文件运行此命令,给出:

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

这表明 test_user 帐户显示在/ etc / passwd文件的第31行。

答案 5 :(得分:0)

此外,您应该写$foo+=1

,而不是foo=$(($foo+1))