Is there a way to remove/delete cron jobs created by Puppet by using awk/sed? I know that we can edit by crontab -e command manually, but this is a question for scripting.
Example root cron is a file in /var/spool/cron/crontabs/root. I want to remove lines below.
# Puppet Name: cron1
[email protected],admin@localhost
* * * * * /bin/true
# Puppet Name: cron test
PATH="/usr/local/bin"
[email protected]
2-57 * * * * echo "test"
# Puppet Name: thank you
* * * * * echo "Thank you!"
....
Puppet cron has patterns:
- Begin with
# Puppet Name: - It can contain Cron Environment or not. This can be multiple lines
If anyone knows how to do it, please help. Thank you!
CodePudding user response:
You would be well advised to use Puppet to remove the crontab entries that were created by Puppet.
If you have to do it via a manual-ish shell command, however, then you can do it via this sed command:
sed -nie '/^# Puppet Name:/!{p;d};:p;n;/^[ \t]*\(\|#.*\|[A-Za-z_][A-Za-z_0-9]*[ \t]*=.*\)$/ b p' \
/var/spool/cron/crontabs/root
Explanation
The command assumes that each group of lines to delete starts with a "Puppet Name:" comment and continues up to and including the next line that is neither blank (but for whitespace), nor a comment, nor an environment variable assignment. It modifies the specified file in place (-i), with auto-printing disabled (-n). The expression (-e) does the following:
- If the next line read does not start with the text "
# Puppet Name:" then print that line and start the next cycle ({p;d}). Otherwise, - this point in the expression is labelled "p" (
:p); - silently (because auto-print is disabled) read the next line of input (
n); - if the current line is blank, is a comment, or is an environment setting then branch to label p (
b p); - else the end of the expression is reached. Silently (because auto-print is disabled) start the next cycle.
