如何使用Bash读取特定行和特定字段?

时间:2011-10-17 12:49:33

标签: linux bash sh bash4

我有这个文件,我想只得到testme =的值,以便我可以做另一个动作。但这会抛出很多线条,实际上还不能让它发挥作用。

1。 test.sh

#!/bin/bash
for i in $(cat /var/tmp/test.ini); do
  # just one output i need: value1
  grep testme= $i 
done

2。 /var/tmp/test.ini

; comments
testme=value1
; comments
testtwo=value2

5 个答案:

答案 0 :(得分:2)

怎么样

#!/bin/bash

grep 'testme=' /var/tmp/test.ini | awk -F= '{ print  $2 }'

或者只是使用bash

#!/bin/bash

regex='testme=(.*)'

for i in $(cat /var/tmp/test.ini);
do
    if [[ $i =~ $regex ]];
    then
        echo ${BASH_REMATCH[1]}
    fi
done

答案 1 :(得分:2)

我检查了你的代码,问题出在你的for循环中。

你实际读过文件的每一行,然后把它交给grep,这是不正确的。我猜你有很多行有错误,

  

没有这样的文件或目录

(或类似的东西)。

你应该给grep你的文件名。 (没有for循环)

e.g。

grep "testme=" /var/tmp/test.ini

答案 2 :(得分:1)

grep -v '^;' /tmp/test.ini | awk -F= '$1=="testme" {print $2}'

grep删除注释,然后awk找到变量并打印其值。或者,在一个awk行中同样的事情:

awk -F= '/^\s*;/ {next} $1=="testme" {print $2}' /tmp/test.ini 

答案 3 :(得分:1)

这个怎么样?

$ grep '^testme=' /tmp/test.ini  | sed -e 's/^testme=//' 
value1

我们找到该行然后删除前缀,只留下值。 Grep为我们做了迭代,不需要明确。

答案 4 :(得分:0)

awk可能是正确的工具,但由于这个问题似乎暗示你只想使用shell,你可能想要这样的东西:

while IFS== read lhs rhs; do
  if test "$lhs" = testme; then
     # Here, $rhs is the right hand side of the assignment to testme
  fi
done < /var/tmp/test.ini