当前位置: 技术问答>linux和unix
如何能够更新文件中的指定字符串??
来源: 互联网 发布时间:2016-06-04
本文导语: 我现在用sar命令输出Linux服务器中的机器信息,包括cpu和内存信息等等,然后将获取的信息输出到指定的文件中,由于要定时更新此文件中的信息,但又不想由于不断插入数据导致此文件过大,希望能够通过某些命令...
我现在用sar命令输出Linux服务器中的机器信息,包括cpu和内存信息等等,然后将获取的信息输出到指定的文件中,由于要定时更新此文件中的信息,但又不想由于不断插入数据导致此文件过大,希望能够通过某些命令直接更新此文件中的某些行内的字符串数据即可,如何能做到呢??
例如文件信息如下:
idle:88
system:10
我想要只更新idle后面的数据即可,如何做到呢??或者在">>***.txt"的时候能否直接覆盖原有数据,而不是在原有内容下方插入呢??
例如文件信息如下:
idle:88
system:10
我想要只更新idle后面的数据即可,如何做到呢??或者在">>***.txt"的时候能否直接覆盖原有数据,而不是在原有内容下方插入呢??
|
用fputs函数即可实现在文件的某个地方插入信息;不过一定要考虑插入的信息可能会覆盖后面的内容。
pos = findoption(fp, 120, aOpLine);
if ( -1 != pos )
{
//把文件指针指向文件头
fseek(fp, 0, SEEK_SET);
//获取option name
getoption(aOpLine, 1, aTemp);
memcpy(acName, aTemp, 16);
//获取option flag
getoption(aOpLine, 2, aTemp);
cFlag = atol(aTemp);
//获取option code
getoption(aOpLine, 3, aTemp);
iCode = atol(aTemp);
memset(aOpLine, 0, sizeof(aOpLine));
sprintf(aOpLine, "%s#%4d#%dn", acName, 120, iCode);
//把文件指针指向要写的行
fseek(fp, pos, SEEK_SET);
fputs(aOpLine, fp);
}
pos = findoption(fp, 120, aOpLine);
if ( -1 != pos )
{
//把文件指针指向文件头
fseek(fp, 0, SEEK_SET);
//获取option name
getoption(aOpLine, 1, aTemp);
memcpy(acName, aTemp, 16);
//获取option flag
getoption(aOpLine, 2, aTemp);
cFlag = atol(aTemp);
//获取option code
getoption(aOpLine, 3, aTemp);
iCode = atol(aTemp);
memset(aOpLine, 0, sizeof(aOpLine));
sprintf(aOpLine, "%s#%4d#%dn", acName, 120, iCode);
//把文件指针指向要写的行
fseek(fp, pos, SEEK_SET);
fputs(aOpLine, fp);
}
|
sed -ri "s/^(idle: ).*$/1$(sar | tail -n1 | awk '{print $NF}')/" URFILE
其中:
(idle: ).*是以你提供的例子设定的,表示URFILE中idle一行的格式,可参考实际情况修改;
$(sar | tail -n1 | awk '{print $NF}')是随便用了一个average idle值,可根据你的取值修改,如果已经有现成的变量idle_value,直接将这部分修改为$idle_value即可。
其中:
(idle: ).*是以你提供的例子设定的,表示URFILE中idle一行的格式,可参考实际情况修改;
$(sar | tail -n1 | awk '{print $NF}')是随便用了一个average idle值,可根据你的取值修改,如果已经有现成的变量idle_value,直接将这部分修改为$idle_value即可。
|
如果
idle:88 是独立的一行,应该可以用sed来替换:
value=99
sed "s/^idle.*$/idle:$value/g" xxx.txt>yyy.txt
cp yyy.txt xxx.txt
不过没试过$value能不能输出。
idle:88 是独立的一行,应该可以用sed来替换:
value=99
sed "s/^idle.*$/idle:$value/g" xxx.txt>yyy.txt
cp yyy.txt xxx.txt
不过没试过$value能不能输出。
|
sed 命令可以做,楼上正解
|
lz 需要的是
command >xxx.txt