使用shell脚本从一行中提取字符串

时间:2018-08-07 20:39:06

标签: bash shell unix scripting

我有几行这样的内容作为文件的一部分

plot.margin

我要提取字符串 'abcd','efgh','hijk','lmno'

如何提取它们?到目前为止,这是我尝试过的:-

the jdbc:mondrian:DataSource=abcd_datasource
the jdbc:mondrian:DataSource=efgh_datasource
the jdbc:mondrian:DataSource=hijk_datasource
the jdbc:mondrian:DataSource=lmno_datasource 

谢谢

3 个答案:

答案 0 :(得分:1)

使用GNU grep,您可以这样做:

grep -ioP 'DataSource=\K[a-z\d]+' file

abcd
efgh
hijk
lmno

如果您没有GNU grep,请使用以下sed

sed 's/.*DataSource=\([a-zA-Z0-9]*\).*/\1/' file

答案 1 :(得分:1)

#!/usr/bin/env bash
logFileName=$1

datasource_re='jdbc:mondrian:DataSource=([[:alnum:]]+)_datasource'
while read -r errorLogLine; do
  if [[ "$errorLogLine" =~ $datasource_re ]]; then
    echo "Found source: ${BASH_REMATCH[1]}"
  fi
done < <(grep -i "_datasource" "$logFileName")

注意:

  • [[ "$var" =~ $regex ]]中的引号和空格非常有意思。
    • 必须在操作员周围有空格。
    • 如果希望将其解析为正则表达式而不是文字字符串,请一定不要引用右侧。
  • BashFAQ #1我如何逐行(和/或逐字段)读取文件(数据流,变量)?
  • Why you don't read lines with for
  • BashPitfalls #50,以了解为什么array=( $(...) )格式不正确。

答案 2 :(得分:0)

您还可以按如下所示使用简单的awk单行代码:

awk 'BEGIN{FS="DataSource=|_datasource"}{print $2}' file

输出:

abcd
efgh
hijk
lmno

希望有帮助!