我正在尝试让这个脚本基本上从命令行上的文件中读取输入,使用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
有人可以向我解释这个问题吗?
感谢
答案 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))