【发布时间】:2022-01-04 20:33:07
【问题描述】:
我想写一个别名,以便我的 squeue 命令只输出正在运行的模拟。对于我的 squeue 命令,我的 .bashrc 中有一个别名,如下所示
alias sq='squeue -u as1056 --format="%.18i %.36j %.8u %.2t %.10M %.10L %.6D %.6C %.12P %R"'
有了这个,我可以将正在运行的模拟输出为
sq | awk '$4 == "R" {print $0}'
这在命令行中按预期工作。我现在想将此命令添加为别名
alias sqrun='sq | awk "$4 == \"R\" {print $0}"'
如您所见,等号后的单引号已经用尽,因此在 awk 命令后需要双引号。但是,要匹配第 4 列中的模式,我需要指定另一个字符串。由于已经使用了单引号和双引号,我不确定在这种情况下如何指定字符串。我尝试使用反斜杠转义双引号,但它会引发错误:
awk: cmd. line:1: == "R" {print -bash}
awk: cmd. line:1: ^ syntax error
那么在这种情况下我应该如何指定别名呢?
Edit1:通过在 sq 命令中匹配一个简单的 R 模式,这是一种肮脏的方式。问题是它经常匹配包含单词“DRAINED”的列。所以我可以使用 sed 删除这些行。所以像
sq | awk "/R/ {print $0}" | sed "/DRAINED/d"
不会遇到命令中有 3 个引号的问题。但是我想避免这种方法,因为它不是通用的,并且如果碰巧有一列包含 R 并且不包含单词“DRAINED”,则可能会给出错误的结果。
PS:这是我关于 stackoverflow 的第一个问题,所以如果您发现我提出这个问题的方式有任何错误,我将非常感谢您的反馈!
【问题讨论】:
-
使用函数代替别名会更容易
-
感谢您的提示!在一般用法中,是否最好在 .bashrc 中定义函数而不是别名?还是您只是为了避免引号问题而提及它?