有很多关于删除前导空格并使用awk将条目附加到文件中的单个现有行的帖子。我的尝试都没有奏效 - 这里只有我尝试过的许多例子。
假设我有一个名为$ log的文件,只有一行
a:b:c
我想添加第四个条目,
awk '{ print $4"d" }' $log | tee -a $log
输出似乎是换行符
`A:B:C:
D'
然而,我希望所有人都在同一条线上;
a:b:c:d
尝试
BEGIN { FS = ":" } ; awk '{ print $4"d" }' $log | tee -a $log
或者,这 - 避免换行
awk 'BEGIN { ORS=":" }; { print $4"d" }' $log | tee -a $log
没变
`A:B:C:
D'
awk在c:
之后放置一个空格,然后将d
写入下一行。
编辑:| tee -a $ log似乎是将附加字符串写入文件所必需的。
$ log包含39个变量,是使用awk生成的,没有|发球台
奇...
将40美元写入单行条目的实际命令
awk '{ print $40"'$imagedir'" }' $log
产量
+ awk '{ print $40"/home/geoland/Asterism-DEVEL/DSO" }'
/home/geoland/.asterism/log
但这不会写入$ log文件。
我应该如何使用awk将d
附加到同一行而不引导空格 - 同时查看sed xargs和其他替代方案。
使用sed
:
$ echo a:b:c | sed 's,\(^.*$\),\1:d,'
a:b:c:d
谢谢大家...这是我选择的解决方案。我还需要将整行写入永久日志文件,因为日志文件会在每个新流程实例中被覆盖。
我将进一步研究一个awk解决方案。
logname=$imagedir/log_$name
while IFS=: read -r line; do
echo "$line$imagedir"
done < $log | tee $logname
这将$ imagedir直接放在最后一个IFS':'分隔符后面
可能还有改进的空间。
我也不完全确定你在这里要做什么。
你的命令行awk '{ print $4"d" }' $log | tee -a $log
在很多方面都存在问题。
首先,您的awk脚本尝试打印第4个字段,该字段为空。除非你另有说法,否则字段用空格分隔,字符串a:b:c
没有空格。所以.. awk打印“d”。并且tee -a
会附加到您现有的日志文件中,因此您看到的是原始数据以及由awk打印的d
。这完全是预期的。
其次,它似乎有tee
附加到awk
正在阅读的同一个文件。这不会产生无限循环,因为awk
应该在文件打开后的最后一个字节之后停止读取输入文件,但它确实意味着你可能在那里重复数据。
除了一些语法错误之外,你的其他尝试都遭受了同样的假设,即$4
意味着它没有。
以下awk片段将输入和输出字段分隔符设置为:
,然后将第4个字段设置为“d”,然后打印该行。
$ echo "a:b:c" | awk 'BEGIN{FS=OFS=":"} {$4="d"} 1'
a:b:c:d
那是你要的吗?
如果确实需要将此数据附加到现有日志文件,则可以使用tee -a
或简单的>>
重定向。请记住,awk只会在运行时看到文件的内容,并且通过追加,您不会替换行。
另一件事。如果你实际上希望在awk中使用shell变量$imagedir
的内容,你应该传入变量而不是退出引号。例如:
$ echo "a:b:c" | awk -v d="foo/bar" 'BEGIN{FS=OFS=":"} {$4=d} 1'
a:b:c:foo/bar
sed "s|$|$imagedir|" file | tee newfile
这样就可以了。读取'file'并将'file'的内容写入'new file',以便在使用辅助独立进程时读取映像目录。
因为变量是一个目录,其中有几个/这些需要被转义,所以不要解释为sed分隔符。我使用变量时遇到了困难。
更简洁的选择是使用替代分隔符。不要与随后的管道混淆。