bash:一种更有效的方法来搜索文件中的字符串并提取部分字符串

时间:2014-03-03 15:12:17

标签: string bash file variables awk

我有一个输入文件如下:

some lines with quote and :
AGE:23
some lines with quote and :
NAME:2,0,"My Name Is"
some lines with quote and :

实际上我使用此代码从文件中提取信息:

  age="$(cat "$file" | awk -F ':' '/AGE:/ { print $2 }')"
  name="$(cat "$file" | awk -F '"' '/NAME:/ { print $2 }' )"
  echo "age: $age"
  echo "name: $name"

输出:

age: 23
name: My Name Is

我正在寻找一种更好的方法,而不是两次运行cat和awk。我有搜索在一个cat / awk线上做但不能解决它,在这种情况下没有占用?有人能给我一个更好的方法吗?

提前致谢

3 个答案:

答案 0 :(得分:3)

while IFS=: read key value; do
    case $key in
        AGE)  age=$value;;
        NAME) name=$(awk -F'"' '{print $2}' <<< "$value");;
    esac
done < "$file"

答案 1 :(得分:2)

我喜欢@ JohnKugelman的方法,但可以改进:使用冒号和引号作为字段分隔符:

while IFS=':"' read -ra fields; do 
    case ${fields[0]} in 
        AGE)  age=${fields[1]}  ;; 
        NAME) [[ ${fields[1]} == "2,0," ]] && name=${fields[2]} ;; 
    esac
done < file

用awk,我写道:

read age name < <(
    awk -F '[:,]' '
        $1 == "AGE" {printf "%s ",$2} 
        $1 == "NAME" && $2 == 2 && $3 == 0 {printf "%s ",$NF} 
        END {print ""}
    ' filename 
)

答案 2 :(得分:1)

如果您的问题中显示的数据很简单。不需要为此使用shell,只需awk就足够了

awk -F '"' '/AGE/{print tolower($0)}/NAME/{print "name:"$2}' input.txt