如何提取CSV字段并将其传递给另一个命令

时间:2019-01-09 16:35:29

标签: bash

我有一个bash脚本,该脚本发出一个API请求,该请求以CSV格式返回结果。 我只想从第一行中提取“ id”值(在其余各行中总是相同),然后将其传递给wget命令(例如wget http://test.com/ $ id)

当前的bash脚本:

req = curl -k -d '{"returnFormat":"csv","eventid":"2"}' -H "Authorization: xxx" -H "Accept: application/json" -H "Content-type: application/json" -X POST https://test.api/restSearch

输出:

id,category,type,value,comment,date,subject_tag
1357,"activity","domain","dodskj.com","comment",1547034584,"kill-chain"
1357,"activity","ip-dst","8.8.6.6","comment example",1547034600,"maec-mal""

根据此示例,我想将值“ 1357”提取到变量中并将其发送到wget命令或任何其他命令。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用cut命令...

curl <params> | cut -d, -f1

awk

curl <params> | awk -F, '{print $1}'

对于您的特定示例,如果只希望第二行,则可以使用:

curl <param> | awk -F, 'NR == 2 {print $1}'

如果要基于特定字段选择一行,则:

curl <param> | awk -F, '$4 == "dodskj.com" {print $1}'

(您可以使用~运算符代替==来匹配正则表达式)

您也可以在与exit的第一场比赛后休息:

curl <param> | awk -F, '$4 == "dodskj.com" {print $1; exit}'

然后,您可以将整个批次封装在$()中,以分配给变量...

VAR=$(curl ... | awk ...)

希望有帮助!

答案 1 :(得分:0)

您可以将csv通过管道传输到awk

req=$(<prev_cmd> | awk -F, 'NR==2{print $1}')

-F,告诉awk字段以逗号分隔。
NR==2仅在第二行大括号中运行脚本。
print $1将打印第一个字段。

$(...)执行command substitution

注意:请记住变量分配之间不能有空格。