0

命令是

sacct -u  -S 2021-07-01 -E 2021-08-01  --format=jobID,Submit -D

我有一个在 bash 中运行的命令,输出如下(快照)。它不从文件中读取

Job ID           Submit
128444           2021-07-01T10:12:30
127898           2021-06-09T03:45:30
127999           2021-06-21T16:45:20
129999           2021-07-15T11:30:29
131989           2021-07-31T01:20:30

我需要过滤并仅显示 7 月份的工作 ID,即从 2021-07-01 到 2021-07-31,不包括 6 月份的条目。

我试过 awk 但它不起作用。

sacct -u  -S 2021-07-01 -E 2021-08-01  --format=jobID,Submit -D |
awk '{print $2}'| awk '/^2021-07-01*/,/2021-07-31*/'

有没有一个班轮可以做到这一点?

4

2 回答 2

0

用 sed

sed -nE 's/^([^ ]*).*-07-.*/\1/p'

或 awk

awk -F'-| *' '$3=="07" {print $1}'
于 2021-08-13T10:05:47.720 回答
0

斜线之间的表达式需要是正则表达式。

在正则表达式中,x*表示 0 次或多次重复xx后面没有任何内容(如在 shell 通配符中)。

此外,您的命令将打印 *just_ 日期,而不是整个条目。(无论如何,将 Awk 连接到 Awk 通常是没有意义的;您可以将第二个 Awk 脚本重构为第一个。)

sacct -u  -S 2021-07-01 -E 2021-08-01  --format=jobID,Submit -D |
awk '$2 ~ /^2021-07-/'

如果您真的只想打印第二个字段,

awk '$2 ~ /^2021-07-/ { print $2 }'

会那样做;但随后可能会传递一个不同的值---format,这样sacct就不会打印您不关心的字段。

如果您想保留标题行,您可以添加NR==1作为何时打印的替代条件。

sacct -u  -S 2021-07-01 -E 2021-08-01  --format=jobID,Submit -D |
awk 'NR == 1 || $2 ~ /^2021-07-/'

斜线之间的文本始终是静态正则表达式。要匹配从字符串构建的动态正则表达式(在脚本执行期间可能会发生变化),请尝试类似

sacct -u  -S 2021-07-01 -E 2021-08-01  --format=jobID,Submit -D |
awk -v yyyy_mm="$(date +%Y-%m)"  '$2 ~ "^" yyyy_mm "-"'
于 2021-08-13T10:16:21.883 回答