基于分隔符在bash中拆分字符串

pre*_*rex 1 bash split

我有一个文件log_file,其中包含的内容

CCO O-MR1 Sync:No:3:No:346:Yes
CCO P Sync:No:1:No:106:Yes
CCO P Checkout:Yes:1:No:10:No
CCO O-MR1 Checkout(2.2):Yes:1:No:10:No
Run Code Online (Sandbox Code Playgroud)

我试图获取基于":"分隔符的4个字段我拥有的脚本是

#!/bin/bash
log_file=$1

for i in `cat $log_file` ; do
        echo $i
        field_a=`echo $i | awk -F '[:]' '{print $1}'`
        echo $field_a
        field_b=`echo $i | awk -F '[:]' '{print $2}'`
        echo $lfield_b
        ...
done
Run Code Online (Sandbox Code Playgroud)

但是此代码为field_a提供的值是错误的,它会根据""分隔符拆分该行.echo $ i也打印错误的值.

还有什么可以用来纠正这个问题?

Cha*_*ffy 5

BashFAQ#1 详细介绍了这一点.总而言之,使用带有set 的循环来包含(仅)应该用于分割字段的字符.while readIFS

while IFS=: read -r field_a field_b other_fields; do
  echo "field_a is $field_a"
  echo "field_b is $field_b"
  echo "Remaining fields are $other_fields"
done <"$log_file"
Run Code Online (Sandbox Code Playgroud)