将输出写入文件中间

Writing Output to Middle of File

我目前正在编写循环输入文件的脚本,输入文件的格式类似于 Linux 中的 /etc/hosts 文件。例如,输入文件看起来像这样:

192.168.1.21     host1
192.168.1.17     host5
192.168.1.168    host9
192.168.1.3      host3
192.168.1.37     host4

输入文件中的数据需要添加到另一个文件(已经存在的主机文件),但需要按字母顺序排序。

以下代码片段显示了我如何编写脚本。

#Assign parameters to variables
inputFile=
hostsFile=

while read line
do

#Extract data from input file
ipAddress=`echo $line | awk '{print }'` 
hostName=`echo $line | awk '{print }'`

    #Loop to add host to hostname file, maintaining alphabetical order
    while read line
    do
        addHost=`echo $line | awk '{print }'`
        if [[ $profileEntry < $deviceName ]]; then
            #Add device in sorted alphabetical order 
            echo $ipAddress "\t" $hostName >> $hostsFile
            break;
        fi
    done < $hostsFile

done < $inputFile

我正在进行字符串比较,但是当我使用 >> 或 > 运算符写入文件时,输出将追加到文件末尾。是否有任何 Linux ksh 构造或其他方法可用于 shell 脚本,允许我按字母顺序插入文本行,而不是将文本附加到文件末尾。

您要求的是不可能的:OS 本身无法在文件中间插入(而不是替换)内容。除了 O_APPEND 生效时,write() 调用覆盖并替换文件指针当前位置之后的任何内容。

从头开始编写一个新文件,然后将其重命名为您要替换的原始文件;这具有作为原子操作的好处:

#!/usr/bin/env ksh

inputFile=
hostsFile=
tempFile=$(mktemp "${hostsFile}.XXXXXX")

if sort -u -- "$inputFile" "$hostsFile" >"$tempFile"; then
  mv -- "$tempFile" "$hostsFile" && exit
fi
rm -f -- "$tempFile"