使用grep -v'^ $'时出现非法的变量名错误

时间:2018-10-29 16:13:47

标签: 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] -'  | grep -v '[2][0-1]:[0-5][0-9] -' `"

该代码应将在22:00至05:00(不包括05:00)之间登录的用户存储到名为users的变量中。它还应删除输出中的所有空行。这是我在第一个代码中要尝试的操作,但是它给了我上述错误。

1 个答案:

答案 0 :(得分:1)

我不知道如何解释它,但这是典型的CSH陷阱之一。

<双引号>($)之间的")(如果它们位于`)和({')始终被认为是变量名。因此,如果之后的单词不是有效的变量名,那么事情就开始抱怨了。例如:

$ grep "foo$" file.txt
Illegal variable name.

这正是您的问题所在。你也写过类似的东西

$ set var = "`grep -v '^$' file.txt`"

,即使之间的之间,又在之间保留命令替换的空白和制表符,在之间,没关系!没有希望!您全心全意地使用了,但是它只是在您的脸上炸毁了!抵抗是徒劳的,您的将被同化为变量,即使不是变量也是如此! CSH只是不在乎!你只想哭!你甚至无法逃脱!

如果您使用来自 util-linux last,您可能会对标记--since--until感兴趣(请参阅herehere)。否则,您可以使用以下命令行:

set users="`last | awk '/(2[2-3]|0[0-4]):.. [-s]/'`"

这将匹配用户在22 en 05(excl)之间登录并且可能仍在登录的所有行。

作为一般说明,出于多种原因,我建议从CSH切换到BASH。其中提到了herehere