逐行读取文件并将参数传递给其他shell脚本

时间:2018-09-28 14:53:53

标签: bash shell while-loop

因此,我正在尝试使用bash脚本自动创建用户。我有以下脚本:

#!/bin/bash

cd /tmp/new/

cat autoid`date +%Y%m%d`.csv | grep "THING" | grep "4B"
while read -r line;
        do
                name=$(awk -F';' '{print $10}' | awk -F' ' '{print $1}')
                surname=$(awk -F';' '{print $10}'|awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}')
                userid=$(awk -F';' '{print $8}')
                bash new_user.sh $userid $name $surname
                sleep 1
                bash basic_access.sh C $userid
                sleep 1
        done

问题是我在这里有点困惑。我正在使用echo代替调用其他bash脚本来测试命令,除了“ cat autoid date +%Y%m%d。csv | grep” THING“ | grep” 4B“的输出之外,它什么也没有返回”行。试图将该行的末尾传递到while循环中,但是它仍然无法正常工作。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

您需要将输出通过管道传递到while循环。变量line应该分别传递给每个awk进程(以解决您的紧迫问题;请继续阅读以寻求更好的解决方案):

#!/bin/bash

cd /tmp/new/

cat autoid`date +%Y%m%d`.csv | grep "THING" | grep "4B" |
  while read -r line;
        do
                name=$(echo "$line" | awk -F';' '{print $10}' | awk -F' ' '{print $1}')
                surname=$(echo "$line" | awk -F';' '{print $10}'|awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}')
                userid=$(echo "$line" | awk -F';' '{print $8}')
                bash new_user.sh $userid $name $surname
                sleep 1
                bash basic_access.sh C $userid
                sleep 1
        done

但是,反复调用awk以获取单个字段效率低下。让read进行拆分。 (包括其他各种修复和改进。)

grep "THING" "autoid$(date +%Y%m%d).csv" | grep "4B" | 
  while IFS=";" read -ra fields; do 
    read name surname <<< "${fields[9]}"
    userid=${fields[7]}
    bash new_user.sh "$userid" "$name" "$surname"
    sleep 1
    bash basic_access.sh C "$userid"
    sleep 1
 done