我有一个文件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
最优雅的方法是什么?
答案 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]}
答案 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|'
}