目前,当我执行getent数据库时,它会以下列形式给我一个结果:
string1,string2,string3,string4,string5
我有一个文本文件,其格式如下:
string1,number
string2,number
string3,number
每次运行我的shell脚本时,我都想获取数据库的内容并与文本文件进行比较。如果数据库中有新的字符串没有在我的文本文件中退出,我想在文本末尾用随机数写新字符串,这样文本文件就会变成:
string1,number
string2,number
string3,number
string4,number
string5,number
对shell来说还是新手......我应该研究哪种最好的方式和语法?
答案 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的新手时,请看:
IFS
环境变量以及它如何影响读取功能。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中找不到该条目,则打印带有随机数的新条目。