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=
我正在编写一个脚本以仅从我的 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=