我目前正在编写一个循环输入文件的脚本,输入文件的格式类似于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脚本中使用,这将允许我按字母顺序插入文本行,而不是将文本附加到文件的末尾。
答案 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"