从文件行返回数据的最简单方法

时间:2015-04-20 15:34:43

标签: bash

我有一个文件tmp.info,其格式如下:

foo..............bar
alligator........bear
cat..............dog

我希望在bash中创建一个小的包装器命令,当第一个字符串提供给函数时,该命令返回行中的第二个字符串。例如,像:

#!/bin/bash

get_from_info_file() {
cat $1 | grep $2 | grep ????????
}

echo `get_from_info_file tmp.info alligator`

应该返回:

>>> bear

最优雅的方法是什么?

6 个答案:

答案 0 :(得分:7)

你可以使用awk,就像这样:

get_info_from_file() {
    awk -F'\\.+' -v search="$2" '$1 == search { print $2 }' "$1"
}

这会将字段分隔符设置为一个或多个.,并使用传递给函数的第二个参数设置变量search。如果第一个字段$1等于搜索字符串,则打印第二个字段。

使用您问题中的文件对其进行测试:

$ get_info_from_file tmp.info alligator
bear

答案 1 :(得分:3)

将此函数声明为:

#!/bin/bash

get_from_info_file() {
    sed -n "s/$2\.*\(.*\)/\1/p" "$1"
}

filename作为第一个参数并将搜索到的密钥作为第二个参数调用:

echo `get_from_info_file tmp.info alligator`

打印:

bear

答案 2 :(得分:1)

此功能可实现您所需的功能:

function getValue(){
     local value=$1
     local file=$2
     grep ^$value\. $file | tr -s '.' | cut -d'.' -f2
}

答案 3 :(得分:1)

A(不优雅)bash only version:

#!/bin/bash
get_from_info_file() {
  file=$(<$1)
  i1=${file##*$2}
  i2=${i1%%[:punct:]*}
  echo ${i2##*\.}
}

echo `get_from_info_file tmp.info alligator`

答案 4 :(得分:1)

最简单的方法是:

line=$(cat $1 | grep $2) 
array=(${line//./ } ) 
echo ${array[1]} 
  1. grep该行并将其存储在变量
  2. 使用变量替换'。'到空间,将其包装在数组中
  3. 打印数组的第二项

答案 5 :(得分:0)

使用grep(通知\K):

get_from_info_file() {
    grep -Po "$2\.+\K\w+" "$1"
}

usig perl

get_from_info_file() {
    perl -nle 'print $1 if /'"$2"'\.*(.*)/' "$1"
}

使用expr匹配运算符:

get_from_info_file() {
    a=$(grep "$2" "$1")
    expr "$a" : "^\.*\(.[a-z]*\)"
}

使用sed

get_from_info_file() {
    grep "$2" "$1" | sed -r 's|.*\.+(.*)|\1|'
}