我有以下文件
#
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/var/log/ftp.log 640 5 1000 * J
/var/log/hwmond.log 640 5 1000 * J
/var/log/ipfw.log 640 5 1000 * J
/var/log/lpr.log 640 5 1000 * J
/var/log/ppp.log 640 5 1000 * J
/var/log/wtmp 644 3 * @01T05 B
我想用不同的数字更改与count相等的列。
我已经能够使用以下命令执行此操作。
cat /etc/newsyslog.conf | awk '$1~"\\/var*"{$3="3333a"}1'
但是,此命令的结果会破坏文件中的所有选项卡。并且文件导致以下不理想。
#
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/var/log/ftp.log 640 3333a 1000 * J
/var/log/hwmond.log 640 3333a 1000 * J
/var/log/ipfw.log 640 3333a 1000 * J
/var/log/lpr.log 640 3333a 1000 * J
/var/log/ppp.log 640 3333a 1000 * J
/var/log/wtmp 644 3333a * @01T05 B
修改
我能够用以下内容修改它,但它还不完美。
awk '$1~"\\/var*"{{$1=$1"\t\t\t"}{$3="3333a"}}1' /etc/newsyslog.conf
导致
#
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/var/log/ftp.log 640 3333a 1000 * J
/var/log/hwmond.log 640 3333a 1000 * J
/var/log/ipfw.log 640 3333a 1000 * J
/var/log/lpr.log 640 3333a 1000 * J
/var/log/ppp.log 640 3333a 1000 * J
/var/log/wtmp 644 3333a * @01T05 B
答案 0 :(得分:2)
对于固定宽度的数据,通常最安全的是直接提取子串:
awk '$1 ~ /^\/var/ {$0 = substr($0,1,45) "3333a" substr($0,51)} 1' file
#
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/var/log/ftp.log 640 3333a 1000 * J
/var/log/hwmond.log 640 3333a 1000 * J
/var/log/ipfw.log 640 3333a 1000 * J
/var/log/lpr.log 640 3333a 1000 * J
/var/log/ppp.log 640 3333a 1000 * J
/var/log/wtmp 644 3333a * @01T05 B
expand file | awk '$1 ~ /^\/var/ {$0 = substr($0,1,45) "3333a" substr($0,51)} 1'
pr -te file | awk '$1 ~ /^\/var/ {$0 = substr($0,1,45) "3333a" substr($0,51)} 1'
答案 1 :(得分:0)
awk '$1~"\\/var*\t\t"{$3="3333a"}1' /etc/newsyslog.conf
应该做的伎俩。注意:避免多次使用cat和awk总是更好。
答案 2 :(得分:0)
为了保持格式完整,首选sed
优先于awk
:
sed -rn '\#^/var/#s/^(([^[:blank:]]+[[:blank:]]+){2})[^[:blank:]]+(.*)/\13333a\3/p' file
/var/log/ftp.log 640 3333a 1000 * J
/var/log/hwmond.log 640 3333a 1000 * J
/var/log/ipfw.log 640 3333a 1000 * J
/var/log/lpr.log 640 3333a 1000 * J
/var/log/ppp.log 640 3333a 1000 * J
/var/log/wtmp 644 3333a * @01T05 B
在OSX上使用sed -E
代替sed -r
。