使用grep-v';时出现非法变量名错误^$';
当我使用这行代码时,我得到一个错误非法变量名:使用grep-v';时出现非法变量名错误^$';,grep,csh,Grep,Csh,当我使用这行代码时,我得到一个错误非法变量名: set users = "` last | sort | tr -s '\t' ' ' | grep '[0,2][0-4]:[0-5][0-9] -' | grep -v '^$' | grep -v '[2][0-1]:[0-5][0-9] -' `" 但当我使用此代码时,它工作正常: set users = "` last | sort | tr -s '\t' ' ' | grep '[0,2][0-4]:[0-5][0-9] -' |
set users = "` last | sort | tr -s '\t' ' ' | grep '[0,2][0-4]:[0-5][0-9] -' | grep -v '^$' | grep -v '[2][0-1]:[0-5][0-9] -' `"
但当我使用此代码时,它工作正常:
set users = "` last | sort | tr -s '\t' ' ' | grep '[0,2][0-4]:[0-5][0-9] -' | grep -v '[2][0-1]:[0-5][0-9] -' `"
代码应将在22:00和05:00(不包括05:00)之间登录的用户存储到名为users的变量中。它还应该删除输出中的任何空行。这是我在第一段代码中试图做的,但它给出了前面提到的错误。我不知道如何解释它,但这是典型的CSH陷阱之一 (
$
)介于(”
)之间的($
)(如果它们介于(`
)和('
)之间,则它们之间的($
)是变量名。因此,如果后面的单词不是有效的变量名,则会开始抱怨。例如:
$ grep "foo$" file.txt
Illegal variable name.
这正是你的问题所在。你也写了类似的东西
$ set var = "`grep -v '^$' file.txt`"
即使是中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,中间的,即使没有!CSH只是不在乎!你只想哭!你甚至无法逃避
如果使用util linux中的last
,您可能会对标志--since
和--until
感兴趣(请参阅和)。否则,您可能会使用以下命令行:
set users="`last | awk '/(2[2-3]|0[0-4]):.. [-s]/'`"
这将匹配用户在22 en 05(不包括)之间登录并且可能仍然登录的所有行
总的来说,我建议从CSH切换到BASH有很多原因。其中一些原因已经提到,并且。我不确定您的核心问题,但是如果您使用
grep-v'^$'
来表示“跳过空行”,使用grep.
可能更容易、更清晰。此外,请编辑您的问题,给出您收到的确切错误消息。确切的错误消息是“非法变量名”。而“grep”会是什么做什么?请粘贴显示的整行文本。第一行是我用argumentsWell执行文件。那太可惜了。谢谢你的回答!@MichaelKročka我为你的命令行添加了一个可能的替代选项。