将输出写入文件中间
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"
我目前正在编写循环输入文件的脚本,输入文件的格式类似于 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"