我正在撰寫一個腳本來僅從我的 crontab 中獲取命令串列。到目前為止,我的輸入資料如下所示:
$ crontab -l | grep -i --color -v '^#' | awk '$0 ~ /^*\/[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 ($0 ~ /^*\/[0-9]{1,20}|\* /) for(i=NF;i>0;i--) { if ( sub(/\//, "", $i) { print $i} } }'
awk: cmd. line:1: { if ($0 ~ /^*\/[0-9]{1,20}|\* /) for(i=NF;i>0;i--) { if ( sub(/\//, "", $i) { print $i} } }
awk: cmd. line:1: ^ syntax error
如何做到這一點?
uj5u.com熱心網友回復:
如果你想
在 '/usr/bin/env bash' 或 '/usr/local/bin/bash' 或 '* */3 * * *' 之后列印所有內容
并給出示例的格式,您可以拆分不同的模式并檢查是否至少有 2 個部分。
如果file包含示例資料:
awk '
{
n = split($0,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
uj5u.com熱心網友回復:
僅從我的 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="[ ]"}{$1=$2=$3=$4=$5="";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
說明:我通知 GNUAWK欄位分隔符 ( FS) 和輸出欄位分隔符 ( OFS) 是單個空格。我不使用默認 FS,因為它會導致將制表符更改為空格字符到空格并壓縮空格(2 個或多個連續空格為單個空格)。對于每一行,我將第 1、第 2、第 3、第 4 和第 5 個欄位設定為空字串,然后使用sub刮掉前導空格,然后print這樣更改的行。
(在 GNU Awk 5.0.1 中測驗)
uj5u.com熱心網友回復:
如果您真的不想要問題中的輸出,而是想要當前接受的答案中顯示的輸出,那么您只需要:
$ 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必須啟用 ERE 的 sed,例如 GNU 或 BSD sed。使用任何 POSIX sed 您可以 sed 's/\([^ ]* \)\{5\}//' file代替或使用任何 POSIX awk awk '{sub(/([^ ]* ){5}/,"")}1' file。
uj5u.com熱心網友回復:
使用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
uj5u.com熱心網友回復:
$ awk -F"bash|env bash|env" '!/^#/ {print $2}' <(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
uj5u.com熱心網友回復:
如果您想考慮潛在的標簽:
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=
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483482.html
上一篇:Bash腳本函式中的意外輸出
