Cron:使用 awk 通过 cron 调度程序显示命令 运行

Cron: Diaplay the commands run by cron scheduler using awk

我正在编写一个脚本以仅从我的 crontab 中获取命令列表。 到目前为止,我的输入数据如下所示:

$  crontab -l | grep -i --color -v '^#' | awk '[=11=] ~ /^*\/[0-9]{1,20}|\*+/'
*/5 * * * * /usr/local/bin/bash msmtp-queue -r 
*/5 * * * * /usr/bin/env bash /Users/tonybarganski/bin/offlineimap-fetch
*/15 * * * * /usr/bin/env bash ~/bin/checkMail
00 12 * * * /usr/local/bin/bash ~/bin/lbdb-fetchaddress-daily
* */3 * * * /usr/bin/env rsync -auv -f"- index.lock" --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.log

结果

打印“/usr/bin/env bash”或“/usr/local/bin/bash”或“* */3 * * *”

之后的所有内容
msmtp-queue -r 
offlineimap-fetch
checkMail
lbdb-fetchaddress-daily
rsync -auv -f"- index.lock" --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.log

尝试过

我尝试从文件末尾 ($NF) 开始打印直到第一个正斜杠的所有内容,但我只是在放置括号的位置出现语法错误:

$ crontab -l | grep -i --color -v '^#' | \
awk -F'/' '{ if ([=13=] ~ /^*\/[0-9]{1,20}|\*+/) for(i=NF;i>0;i--) { if ( sub(/\//, "", $i) { print $i} } }'
awk: cmd. line:1: { if ([=13=] ~ /^*\/[0-9]{1,20}|\*+/) for(i=NF;i>0;i--) { if ( sub(/\//, "", $i) { print $i} } }
awk: cmd. line:1:                                                                              ^ syntax error

如何实现?

get a list of only the commands from my crontab

我只想放弃 5 个第一个字段,让 file.txt 内容成为

*/5 * * * * /usr/local/bin/bash msmtp-queue -r 
*/5 * * * * /usr/bin/env bash /Users/tonybarganski/bin/offlineimap-fetch
*/15 * * * * /usr/bin/env bash ~/bin/checkMail
00 12 * * * /usr/local/bin/bash ~/bin/lbdb-fetchaddress-daily
* */3 * * * /usr/bin/env rsync -auv -f"- index.lock" --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.lo

然后

awk 'BEGIN{FS="[ ]"}{====="";sub(/^ */,"");print}' file.txt

给出输出

/usr/local/bin/bash msmtp-queue -r
/usr/bin/env bash /Users/tonybarganski/bin/offlineimap-fetch
/usr/bin/env bash ~/bin/checkMail
/usr/local/bin/bash ~/bin/lbdb-fetchaddress-daily
/usr/bin/env rsync -auv -f"- index.lock" --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.lo

说明:我通知 GNU AWK 字段分隔符 (FS) 和输出字段分隔符 (OFS) 是单一的 space。我不使用默认 FS,因为它会导致将制表符从 space 字符更改为 space 并压缩 spaces(2 个或多个连续的 spaces 到单个 space).对于每一行,我将第 1、2、3、4 和 5 字段设置为空字符串,然后使用 sub 去除前导 spaces,然后 print 这样更改的行。

(在 GNU Awk 5.0.1 中测试)

如果你想

Print everything after either '/usr/bin/env bash' or '/usr/local/bin/bash' or '* */3 * * *'

根据示例的格式,您可以拆分不同的模式并检查是否至少有 2 个部分。

如果file包含示例数据:

awk '
{
  n = split([=10=],a, /(^\* \*\/3 \* \* \*|\/usr\/local\/bin\/bash|\/usr\/bin\/env[[:space:]]+bash)[[:space:]]+/)
  if (n > 1) {
    print a[2]
  }
}
' file

输出

msmtp-queue -r 
/Users/tonybarganski/bin/offlineimap-fetch
~/bin/checkMail
~/bin/lbdb-fetchaddress-daily
/usr/bin/env rsync -auv -f"- index.lock" --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.log

使用sed(如果适用)

$ sed s'/.*\(bin\/\|\/env \)\?bash \|.*\* //' input_file
msmtp-queue -r
/Users/tonybarganski/bin/offlineimap-fetch
~/bin/checkMail
~/bin/lbdb-fetchaddress-daily
/usr/bin/env rsync -auv -f- index.lock --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.log
$ awk -F"bash|env bash|env" '!/^#/ {print }' <(crontab -l)
 msmtp-queue -r 
 /Users/tonybarganski/bin/offlineimap-fetch
 ~/bin/checkMail
 ~/bin/lbdb-fetchaddress-daily
 rsync -auv -f"- index.lock" --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.log

如果您真的不想要问题中的输出,而是想要当前接受的答案中显示的输出,那么您只需要:

$ sed -E 's/([^ ]* ){5}//' file
/usr/local/bin/bash msmtp-queue -r
/usr/bin/env bash /Users/tonybarganski/bin/offlineimap-fetch
/usr/bin/env bash ~/bin/checkMail
/usr/local/bin/bash ~/bin/lbdb-fetchaddress-daily
/usr/bin/env rsync -auv -f"- index.lock" --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.log

以上需要具有 -E 的 sed 才能启用 ERE,例如GNU 或 BSD sed。使用任何 POSIX sed 你可以做 sed 's/\([^ ]* \)\{5\}//' file 代替或使用任何 POSIX awk awk '{sub(/([^ ]* ){5}/,"")}1' file.

如果您想考虑潜在的选项卡:

mawk 'BEGIN { OFS=_;__=_="[^"(_=" \t]")"*["_; gsub("...",_,_); FS="^"(_)__ } NF=NF'

 or

{n,g}awk 'BEGIN { OFS=_;FS="^("(_="[^"(_=" \t]")"*["_)"){5}" } NF=NF'
 

——————

/usr/local/bin/bash msmtp-queue -r 
/usr/bin/env bash /Users/tonybarganski/bin/offlineimap-fetch
/usr/bin/env bash ~/bin/checkMail
/usr/local/bin/bash ~/bin/lbdb-fetchaddress-daily
/usr/bin/env rsync -auv -f"- index.lock" --exclude={'Macintosh HD','MyArchive'} ~/mnt/ ~/.Backup/mnt/ > ~/crypto-vols-backup.log

如果标签不重要,那就更简单了:

{n,g}awk 'NF=NF' FS='^([^ ]+[ ]+){5}' OFS=