英文:
sed + append new lines after matched word but ignore if lines are exists
问题
我们创建以下sed命令行以在匹配的单词之后添加行(在Red Hat 7.x机器上):
sed -i '/\[Service\]/a MemoryAccounting=yes\nMemoryCurrent=8192000\nMemoryLimit=8192000' /lib/systemd/system/rsyslog.service
在更新之前的文件示例:
cat /lib/systemd/system/rsyslog.service
[Unit]
Description=System Logging Service
;Requires=syslog.socket
Wants=network.target network-online.target
After=network.target network-online.target
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Restart=on-failure
UMask=0066
StandardOutput=null
Restart=on-failure
[Install]
WantedBy=multi-user.target
;Alias=syslog.service
通过sed进行更新后的文件示例:
cat /lib/systemd/system/rsyslog.service
[Unit]
Description=System Logging Service
;Requires=syslog.socket
Wants=network.target network-online.target
After=network.target network-online.target
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/
[Service]
MemoryAccounting=yes
MemoryCurrent=8192000
MemoryLimit=8192000
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Restart=on-failure
UMask=0066
StandardOutput=null
Restart=on-failure
[Install]
WantedBy=multi-user.target
;Alias=syslog.service
现在的问题是,当再次运行sed命令时,我们会得到重复的行:
[Service]
MemoryAccounting=yes
MemoryCurrent=8192000
MemoryLimit=8192000
MemoryAccounting=yes
MemoryCurrent=8192000
MemoryLimit=8192000
有没有建议如何在行已经存在时忽略编辑?
英文:
we create the follwinmg sed line in order to add the lines after mached word ( on redhat 7.x machines )
sed -i '/\[Service\]/a MemoryAccounting=yes\nMemoryCurrent=8192000\nMemoryLimit=8192000' /lib/systemd/system/rsyslog.service
example of the file before update
cat /lib/systemd/system/rsyslog.service
[Unit]
Description=System Logging Service
;Requires=syslog.socket
Wants=network.target network-online.target
After=network.target network-online.target
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Restart=on-failure
UMask=0066
StandardOutput=null
Restart=on-failure
[Install]
WantedBy=multi-user.target
;Alias=syslog.service
example of the file after the update by sed
cat /lib/systemd/system/rsyslog.service
[Unit]
Description=System Logging Service
;Requires=syslog.socket
Wants=network.target network-online.target
After=network.target network-online.target
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/
[Service]
MemoryAccounting=yes
MemoryCurrent=8192000
MemoryLimit=8192000
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Restart=on-failure
UMask=0066
StandardOutput=null
Restart=on-failure
[Install]
WantedBy=multi-user.target
;Alias=syslog.service
now the problem is when we run again the sed line then we get duplicate lines as
[Service]
MemoryAccounting=yes
MemoryCurrent=8192000
MemoryLimit=8192000
MemoryAccounting=yes
MemoryCurrent=8192000
MemoryLimit=8192000
any suggestion how to ignore editing when the lines are already exists ?
notes:
in order to complete service update we need to do the following:
systemctl daemon-reload
systemctl restart rsyslog.service
答案1
得分: 1
这部分的中文翻译如下:
这应该可以工作
sed -i.SAVED '/[Service]/N;
s/\n/ /;
/[Service] Type=notify/c
[Service]\
MemoryAccounting=yes\
MemoryCurrent=8192000\
MemoryLimit=8192000\
Type=notify
/[Service] M.*/s/ /\n/
' /lib/systemd/system/rsyslog.service
它使用 `N` 连接行,将 `nl` 替换为空格,检查是否与原始行匹配。
同时保存原始文件以防万一。
英文:
This should work
sed -i.SAVED '/\[Service\]/N;
s/\n/ /;
/\[Service\] Type=notify/c\
[Service]\
MemoryAccounting=yes\
MemoryCurrent=8192000\
MemoryLimit=8192000\
Type=notify
/\[Service\] M.*/s/ /\n/
' /lib/systemd/system/rsyslog.service
it's joining lines using N
, replacing the nl
with space checking if it matches the original line.
Also saving the original file just in case.
答案2
得分: 1
使用sed
命令
$ sed -Eei.bak '/\[service]/I{n;/^memoryaccounting/I!{i MemoryAccounting=yes\nMemoryCurrent=8192000\nMemoryLimit=8192000' -e '}}' input_file
[Unit]
Description=System Logging Service
;Requires=syslog.socket
Wants=network.target network-online.target
After=network.target network-online.target
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/
[Service]
MemoryAccounting=yes
MemoryCurrent=8192000
MemoryLimit=8192000
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Restart=on-failure
UMask=0066
StandardOutput=null
Restart=on-failure
[Install]
WantedBy=multi-user.target
;Alias=syslog.service
英文:
Using sed
$ sed -Eei.bak '/\[service]/I{n;/^memoryaccounting/I!{i MemoryAccounting=yes\nMemoryCurrent=8192000\nMemoryLimit=8192000' -e '}}' input_file
[Unit]
Description=System Logging Service
;Requires=syslog.socket
Wants=network.target network-online.target
After=network.target network-online.target
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/
[Service]
MemoryAccounting=yes
MemoryCurrent=8192000
MemoryLimit=8192000
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Restart=on-failure
UMask=0066
StandardOutput=null
Restart=on-failure
[Install]
WantedBy=multi-user.target
;Alias=syslog.service
答案3
得分: 1
这个 sed
命令会在 [Service]
后面紧跟着以 MemoryAccounting=
开头的行之外跳过文本插入。
sed -i.orig '
/\[Service]/{
n
/^MemoryAccounting=/b
i\
MemoryAccounting=yes\
MemoryCurrent=8192000\
MemoryLimit=8192000
}' rsyslog.service
英文:
This sed
command will skip the insertion of text if the [Service]
is immediately followed by a line starting with MemoryAccounting=
.
sed -i.orig '
/\[Service]/{
n
/^MemoryAccounting=/b
i\
MemoryAccounting=yes\
MemoryCurrent=8192000\
MemoryLimit=8192000
}' rsyslog.service
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论