从List - Unix Shell中提取值

时间:2015-10-08 17:06:37

标签: bash shell unix command-line grep

我试图从列表中提取特定的值。我的输入如下:

link(rel='stylesheet', href='/css/simple.css')
script(type="type/javascript",src="/js/jquery.min.js")

然后我执行以下命令来提取一些数据:

$ cat data.txt

Name: Mike
Age: 20
Date: June 1st
Color: Red

Name: Jon
Age: 22
Date: May 3rd
Color: Blue

Name: Jamie
Age: 18
Date: December 21st
Color: Green

Name: Chris
Age: 24
Date: July 5th
Color: Blue

返回:

grep Name data.txt|cut -c6-20 ;  grep Color data.txt|cut -c7-20

我希望它能返回更像这样的东西:

Mike
Jon
Jamie
Chris
Red
Blue
Green
Blue

最后我希望能够指定Color = blue然后输出:

Mike:Red
Jon:Blue
Jamie:Green
Chris:Blue

非常感谢任何帮助完成这项工作。我是新手来编写脚本,并一直试图通过这个和其他网站自学。

提前致谢!

2 个答案:

答案 0 :(得分:1)

使用awk你可以做到这一点。

第一项任务:

awk -F' *: *|\n' -v RS= '{print $2 ":" $8}' data.txt
Mike:Red
Jon:Blue
Jamie:Green
Chris:Blue

第二项任务:

awk -F' *: *|\n' -v RS= -v Color=Blue '$8 == Color{print $2}' data.txt
Jon
Chris

答案 1 :(得分:0)

anubhava一如既往地提供了一个正确而简洁的解决方案。

但与unix中的所有内容一样,这样做的方法不止一种。

对于子孙后代,我将提供一个仅限bash的答案。

请注意,bash和awk都不提供多维数组或对象,因此您的数据结构有限。在你的情况下,我将假设"姓名"字段在记录中是唯一的,这意味着它可以像'"主键"一样使用。

我们可以读取您的输入文件并使用密钥填充多个bash数组..好吧,密钥。

#!/usr/bin/env bash

# Note that "declare -A", which sets an associative array, requires bash 4.
declare -A Age Date Color

while IFS=': ' read field value; do
  if [ -z "$field" ]; then
    continue
  elif [ "$field" = Name ]; then
    key="$value"
    continue
  fi
  eval $field["\$key"]="\$value"
done < data.txt

这样做的结果是你将拥有一组数组,这些数组的键是数据文件中的名称,其值是这些名称后面的相应字段。

第一项任务:

for Name in "${!Color[@]}"; do
  printf "%s:%s\n" "$Name" "${Color[$Name]}"
done

第二项任务:

for Name in "${!Color[@]}"; do
  if [ "${Color[$Name]}" = "Blue" ]; then
    printf "%s\n" "$Name"
  fi
done

请注意"${!Color[@]}"中的感叹号会导致bash返回索引列表而不是值列表。显然,索引可用于访问值。

显然,不像awk那样简洁,但如果你需要随机访问数组中的数据,那么直接在shell中处理这类事情会非常有用。