【问题标题】:Illegal variable name error when using grep -v '^$' [duplicate]使用 grep -v '^$' 时出现非法变量名错误 [重复]
【发布时间】:2018-10-29 16:13:47
【问题描述】:

当我使用这行代码时,我得到一个错误非法变量名

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 的变量中。它还应该删除输出中的任何空行。这是我在第一个代码中尝试做的,但它给了我上述错误。

【问题讨论】:

  • 我不确定您的核心问题,但如果您使用grep -v '^$' 来表示“跳过空白行”,那么使用grep . 可能更容易、更清晰。
  • 另外,请编辑您的问题以提供您收到的确切错误消息。
  • 确切的错误消息是“非法变量名”。以及“grep”会是什么。做什么?
  • 请粘贴出现的整行文本。
  • gyazo.com/387babdfc5917d21b1b4b6ba4159c73f 第一行是我执行带有参数的文件

标签: grep csh


【解决方案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

【讨论】:

  • 那真是太可惜了。感谢您的回答!
  • @MichaelKročka 我已经为您的命令行添加了一个可能的替代方案。
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 2015-08-20
相关资源
最近更新 更多