【问题标题】:How can i read specific line and specific field using Bash?如何使用 Bash 读取特定行和特定字段?
【发布时间】:2011-10-17 12:49:33
【问题描述】:

我有这个文件,我只想得到 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

【问题讨论】:

  • 您的 test.ini 中是否有多个“testme=...”? grep 怎么给你很多行?

标签: linux bash sh bash4


【解决方案1】:

怎么样

#!/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

【讨论】:

  • 几乎不需要将 grep 的输出通过管道传输到 awk。直接使用awk即可:awk -F= '/testme=/{ print $2 }'
【解决方案2】:

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

您实际上读取了文件的每一行,并将其提供给 grep,这是不正确的。我猜你有很多错误的行,

没有这样的文件或目录

(或类似的东西)。

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

例如

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

【讨论】:

    【解决方案3】:
    grep -v '^;' /tmp/test.ini | awk -F= '$1=="testme" {print $2}'
    

    grep 删除 cmets,然后 awk 找到变量并打印它的值。或者,在单个 awk 行中执行相同的操作:

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

    【讨论】:

      【解决方案4】:

      这个怎么样?

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

      我们找到该行,然后删除前缀,只留下值。 Grep 为我们进行迭代,无需显式。

      【讨论】:

      • 会更简单:sed "/^testme=/ s@^testme=@@" /tmp/test.ini
      【解决方案5】:

      awk 可能是解决此问题的正确工具,但由于该问题似乎暗示您只想使用 shell,您可能想要类似的东西:

      而 IFS== 读取 lhs rhs;做 如果测试 "$lhs" = testme;然后 # 这里,$rhs 是赋值给 testme 的右手边 菲 完成

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 2021-10-27
        • 2012-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多