如何在文件的每一行*内部*循环使用逗号分隔的列表?

时间:2018-09-20 14:58:24

标签: bash

需要在bash脚本中编写一些状态检查器:

具有这样的字符串文件:

domain.com; 111.111.111.111,222.222.222.222; /link/to/somefile.js,/link/to/somefile2.js
domain2.com; 122.122.111.111,211.211.222.222; /link/to/somefile2.js,/link/to/somefile3.js

总共需要执行这样的命令:

curl -s -I -H 'Host: domain.com' http://111.111.111.111/link/to/somefile.js
curl -s -I -H 'Host: domain.com' http://222.222.222.222/link/to/somefile.js

curl -s -I -H 'Host: domain.com' http://111.111.111.111/link/to/somefile2.js
curl -s -I -H 'Host: domain.com' http://222.222.222.222/link/to/somefile2.js

curl -s -I -H 'Host: domain2.com' http://122.122.111.111/link/to/somefile2.js
curl -s -I -H 'Host: domain2.com' http://211.211.222.222/link/to/somefile2.js

curl -s -I -H 'Host: domain2.com' http://122.122.111.111/link/to/somefile3.js
curl -s -I -H 'Host: domain2.com' http://211.211.222.222/link/to/somefile3.js

问题是:

  1. 我需要使用什么工具才能获得全部结果?
  2. 也许带有某些参数/标志的xargs可以这样做还是gnu parallel
  3. 能否请您显示示例?

我可以分隔行并将结果设置为根本没有问题的不同变量:

domain=$(cut -d';' -f1 file| xargs -I N -d "," echo curl -H) \'N\'
ip=$(cut -d';' -f2 file| xargs -I N -d "," echo curl -H) \'N\'
and else

但是其他问题:): 在将字符串分隔并分隔为变量之后,如何在那种情况下使用不同的变量执行curl-不同变量的参数数量会有所不同?

得到Barmar的答案根本没有涵盖任务问题,因为它具有两个以上的列表。问题不在于bash的无知,而是可以解决问题的方式

2 个答案:

答案 0 :(得分:0)

log_command

...作为输出(作为命令列表,如果删除了curl -s -I -H Host:\ domain.com http://111.111.111.111//link/to/somefile.js curl -s -I -H Host:\ domain.com http://222.222.222.222//link/to/somefile.js curl -s -I -H Host:\ domain.com http://111.111.111.111//link/to/somefile2.js curl -s -I -H Host:\ domain.com http://222.222.222.222//link/to/somefile2.js curl -s -I -H Host:\ domain2.com http://122.122.111.111//link/to/somefile2.js curl -s -I -H Host:\ domain2.com http://211.211.222.222//link/to/somefile2.js curl -s -I -H Host:\ domain2.com http://122.122.111.111//link/to/somefile3.js curl -s -I -H Host:\ domain2.com http://211.211.222.222//link/to/somefile3.js 前缀则将运行):

domain

...如您在https://ideone.com/dTC8q8上看到的


现在如何运作?

  • 步骤1:将每一行读入addrs_strfiles_strIFS='; ' read -r domain addrs_str files_str中,并用分号和空格分隔。

    这是行addrs_str的工作,该行的工作如BashFAQ #1How to read variables from file, with multiple variables per line?

  • 所述
  • 第2步:对于files_strcurl,将它们以逗号分隔为单独的数组。 How do I split a string on a delimiter in Bash?
  • 中对此进行了描述
  • 第3步:遍历这些数组,并为每种组合调用PRAGMA temp_store = MEMORY; DROP TABLE IF EXISTS TempQuery; CREATE TEMP TABLE TempQuery AS SELECT ID FROM Person WHERE (Firstname LIKE '%mil%' OR LastName LIKE '%%'); SELECT rowid FROM TempQuery WHERE ID = '48a0231a-af41-450d-a291-5912d39119c9' LIMIT 1; 。如果只想用第一个文件调用第一个IP,而用第二个文件调用第二个IP,则可以使用Iterate over two arrays simultaneously in bash;否则,这是一个普通的嵌套循环。

答案 1 :(得分:0)

使用GNU Parallel,它看起来像这样

doit() {
  domain="$1"
  ips="$2"
  paths="$3"
  parallel --dry-run -d ',' -q curl -s -I -H Host:\ "$domain" http://{1}/{2} ::: "$ips" ::: "$paths"
}
export -f doit
parallel --colsep ';' doit :::: input.file

确信您可以删除--dry-run