当awk不应该删除标签时

时间:2015-01-23 19:12:27

标签: bash shell awk

我有以下文件

#
# 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

3 个答案:

答案 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