用于将结果与文本文件进行比较的Shell脚本?

时间:2016-06-12 23:29:11

标签: bash shell terminal

目前,当我执行getent数据库时,它会以下列形式给我一个结果:

    string1,string2,string3,string4,string5

我有一个文本文件,其格式如下:

    string1,number
    string2,number
    string3,number

每次运行我的shell脚本时,我都想获取数据库的内容并与文本文件进行比较。如果数据库中有新的字符串没有在我的文本文件中退出,我想在文本末尾用随机数写新字符串,这样文本文件就会变成:

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

对shell来说还是新手......我应该研究哪种最好的方式和语法?

3 个答案:

答案 0 :(得分:2)

基础知识

getent的输出为例:

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

我们可以通过以下方式处理:

$ 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

    将其替换为生成所需数据的getent命令。

  • |

    这告诉shell将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

答案 1 :(得分:1)

了解declare -A设置的bash关联数组,特别是以下两个语句之间的区别:

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

快速搜索bash关联数组this tutorial

当你是bash的新手时,请看:

  1. IFS环境变量以及它如何影响读取功能。
  2. 行:for num in ${numbers//,/ }; do echo $num; done;

答案 2 :(得分: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的数组中记录现有的&#34;字符串&#34;在file2处理期间,如果在数组a中找不到该条目,则打印带有随机数的新条目。