使用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我为你的命令行添加了一个可能的替代选项。