Linux之獲取配置檔案行欄位

2021-07-11 02:24:18 字數 2752 閱讀 2318

工作中少不了要提取規則檔案(如:日誌檔案/配置檔案)行或行裡字段資訊,前一段時間在研究某應用程式原始碼時,發現其對

配置檔案資訊的提取方法很巧妙,後來工作上需要與同事之間互動資訊,剛好通過日誌來實現,日誌的格式也是本人制定,提到

的這個方法也就用上了;

就拿最簡單的配置檔案來說,至少包含兩部分資訊:一是有用的注釋,二是引數和引數設定值;

注釋一般以#開頭,整行都是解釋資訊,在讀取時若是行首位元組是#,則該行資訊直接忽略,讀取下一行;

引數和引數值的行一般引數字段定格書寫,兩者之間通過空格隔斷;

如下示例:

# this is a test file.

cnt    1000

現在需要提取檔案中cnt的設定值,方法很簡單,只需要開啟該檔案,然後按行讀取檔案資訊,先判斷行首位元組是否#,若是#則繼續

讀取下一行檔案內容,若不是則比較該行的第乙個字段是否為cnt,若是則提取該行的第二個字段就是cnt引數的設定值;

上面提到的是最基本的應用,實際任務中,閱讀過源**的都了解配置檔案,每個配置檔案有許多引數,這些引數的設定值開發者可以

自行設定,那麼問題來了,這些設定的引數值,軟體在啟動時是怎樣提取到的呢?方法就是上面的延伸了,將讀取到的引數資訊轉換成鍊錶

形式進行儲存,每個節點包含成員有:引數名(char name[255]),引數值(int parameter),指標struct  ***  *next,這樣配置檔案裡面的引數

就儲存到了記憶體的鍊錶中,然後就可以通過提取鍊錶中的值對內部引數賦值;到這一步應該已經沒什麼大問題了,但是結合最近了解的新知識

要是配置檔案引數數量很多,形成的鍊錶就會很長,查詢起來將會消耗大量效能,對於這個問題,如果了解雜湊鍊錶的同學就會想到辦法,這裡

不多說,等研究透徹了在另外一篇博文中會提到,網上也有大量資源可查,將了這麼多,看下上述中最簡單方法的實現:

#include

#include

#include

#include

#include

#define max_len 1024

/*get the specified field in the string*/

char *getnfield(const char *src,char *des,int n)

/*過濾空格*/

while(*tmpsrc == ' ')

/*過濾空行*/

if(*tmpsrc == '\r' || *tmpsrc == '\n' || *tmpsrc == '\0')

/*過濾前n-1個字段*/

while(counter < n)

/*檢測行是否結束,來判斷是否有指定的字段存在*/

if(*tmpsrc == '\r' || *tmpsrc == '\n' || *tmpsrc == '\0')

/*過濾空格*/

while(*tmpsrc == ' ')

counter++;

}/*獲取目標字段*/

while(*tmpsrc != ' ' && *tmpsrc != '\r' && *tmpsrc != '\n' && *tmpsrc != '\0')

*tmpdes = '\0';

return des;

}/*the 1th field is the parameter name*/

char *getparametername(const char *linebuf,char *parameterbuf)

/*the 2th field is the parameter value*/

char *getparametervalue(const char *linebuf,char *valuebuf)

int main(int argc,char **argv);

char parameterbuf[50] = ;

char valuebuf[50] = ;

int ret = 0;

file* fp;

/*usage*/

if(argc != 2)

/*file exists or not*/

ret = access(argv[1],f_ok);

if(-1 == ret)

fp = fopen(argv[1],"r");

if(null == fp)

/*按行讀取檔案內容,並進行檢測*/

while(fgets(linebuf,max_len,fp))

if(getparametername(linebuf,parameterbuf))else

/*這個位置可以新增轉換成鍊錶的功能,將parameter和value作為乙個結構體的成員,新增到單鏈表中*/

/*列印獲取的資訊,其中值可以用atoi轉換為整型資料,可以根據實際情況來定*/

printf("%s = %s\n",parameterbuf,valuebuf);

}fclose(fp);

return 0;

}測試檔案test.txt:

#this is a test file.

#cnt = 1000

cnt 1000

#value = 123

vaule 123

#default = 666

default 666

#end of the file.

測試結果:

linux配置檔案

關於登入linux時,etc profile bash profile等幾個檔案的執行過程。在登入linux時要執行檔案的過程如下 在剛登入linux時,首先啟動 etc profile 檔案,然後再啟動使用者目錄下的 bash profile bash login或 profile檔案中的其中乙個...

Linux 配置檔案

linux系統的配置檔案,在多使用者 多工環境中,配置檔案控制使用者許可權 系統應用程式 守護程序 服務和其他管理任務。這些任務包括管理使用者賬號 分配磁碟配額 管理電子郵件和新聞組,以及配置核心引數。以下是對配置檔案的分類,以red hat為例子進行介紹,不同系統的檔名和路徑可能不一樣。除非另行制...

linux配置檔案

linux檔案系統配置檔案 proc 核心提供的乙個介面,主要用來儲存系統統計資訊 etc mtab 隨著 proc mount的變化而變化,檔案系統的安裝和解除安裝都會在這個檔案中反映出來 etc fstab 列出當前系統在啟動時自動安裝的所有檔案系統,也可以使用mount a 這個命令來手動的安...