2016-06-12 172 views
-1

目前,當我執行getent數據庫,它將給我一個結果如下形式:Shell腳本將結果與文本文件進行比較?

string1,string2,string3,string4,string5 

我有一個具有這種格式的所有文本文件:

string1,number 
    string2,number 
    string3,number 

每次我跑我的shell腳本,我想獲取我的數據庫的內容並與文本文件進行比較。如果在數據庫中的新字符串不退出在我的文本文件,我想寫我用隨機數文本的末尾新字符串,使文本文件將成爲:

string1,number 
    string2,number 
    string3,number 
    string4,number 
    string5,number 

漂亮的新到shell ..什麼是我應該研究的最佳方式和語法?

+0

'string1,string2,string3,string4,string5'輸入到腳本中嗎? – Ola

+0

它是comamnd「getent數據庫」的輸出http://www.tutorialspoint.com/unix_commands/getent.htm – user3669481

回答

2

基礎知識

採取這種輸出getent爲例:它是如何工作

    $ getent passwd daemon | while IFS=: read s1 s2 s3 rest; do printf "%s,%s\n" $s1 $RANDOM $s2 $RANDOM $s3 $RANDOM; done 
    daemon,7721 
    x,9604 
    1,2061 
    

    $ getent passwd daemon 
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 
    

    我們可以處理它,你通過申請

  • getent passwd daemon

    將其替換爲生成所需數據的任何getent命令。

  • |

    這告訴外殼至getent輸出饋送到下一個命令的輸入。

  • while IFS=: read s1 s2 s3 rest; do

    這通過從標準輸入的下一行讀取四個變量開始while循環。由於getent的輸出是冒號分隔的,因此我們將IFS設置爲:

    在問題中,您顯示的逗號分隔爲getent的輸出。如果是這種情況,則用IFS=,代替IFS=:

  • printf "%s,%s\n" $s1 $RANDOM $s2 $RANDOM $s3 $RANDOM

    將打印出前三字符串變量輸出與隨機數增加。

  • done

    此值通知while循環的結束。

多行從

對於那些誰喜歡自己的shell命令分佈在多行:

getent passwd daemon | while IFS=: read s1 s2 s3 rest 
do 
    printf "%s,%s\n" $s1 $RANDOM $s2 $RANDOM $s3 $RANDOM 
done 

比較和更新的參考文件

這將檢查是否存在前testfile前三個字符串中的任何一個字符串,並附加到testfile那些還沒有的字符串:

getent passwd daemon | while IFS=: read s1 s2 s3 rest; do for s in "$s1" "$s2" "$s3"; do grep -qE "^$s," testfile || printf '%s,%s\n' "$s" "$RANDOM">>testfile; done; done 

或者,在多線形態:

getent passwd daemon | while IFS=: read s1 s2 s3 rest 
do 
    for s in "$s1" "$s2" "$s3" 
    do 
     grep -qE "^$s," testfile || printf '%s,%s\n' "$s" "$RANDOM">>testfile 
    done 
done 
+0

如果我不知道gent輸出中有多少變量會怎麼樣?它可能是4或5或6,但數量在變化。另外,我應該如何打開一個文本文件並比較哪個變量已經存在,然後寫入一個不會退出的文件? – user3669481

+0

無論輸出是否有4,5或6個字段,上述工作都是如此。你要求輸出具有「隨機數」。當這些隨機數字與現有文件中的數據「比較」時,你想要發生什麼? – John1024

+0

沒有比較數字,但比較數字前的變量,因此基本上s1,s2,s3與文本文件中的字符串進行比較 – user3669481

1

結識bash的關聯數組由declare -A設置,特別是以下兩個語句之間的區別:

echo 'A: ${strings[@]}='"${strings[@]}"; 
echo 'B: ${!strings[@]}='"${!strings[@]}"; 

一快速搜索bash關聯數組變成了this tutorial

如你是新也打壞看:

  1. IFS環境變量以及它如何影響讀取功能。
  2. 線,如:for num in ${numbers//,/ }; do echo $num; done;
0

我不能完全肯定我理解您的問題聲明。 但是,從我能理解,這可能工作:

$ cat file1 
string1,number1 
string2,number2 
string3,number3 

$ cat file2 
string1,string2,string3,string4,string5 


$ awk -F, 'NR==FNR{a[$1]++; print; next}{for (i=1;i<=NF;i++)if (!($i in a)) print $i"," (int(10000*rand()));}' file1 file2 

string1,number1 
string2,number2 
string3,number3 
string4,2377 
string5,2910 

注:
這裏使用的號碼10000只是一個任意數量。根據需要更改。
另外,由於固有的問題,如果記錄數很大,這些隨機數可能會重複。

代碼說明:
在第一個文件名爲a的數組中記錄現有的「字符串」。在file2處理過程中,如果在數組a中找不到條目,​​則使用隨機數打印新條目。