2016-06-12 214 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中找不到条目,​​则使用随机数打印新条目。