将输出写入文件中间

时间:2017-08-29 19:03:17

标签: linux shell ksh

我目前正在编写一个循环输入文件的脚本,输入文件的格式类似于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=$1
hostsFile=$2

while read line
do

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

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

done < $inputFile

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

1 个答案:

答案 0 :(得分:0)

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

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

#!/usr/bin/env ksh

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

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