Shell Scripting:如何从文件的每一行中选择一个表达式的值

时间:2010-11-28 11:56:01

标签: shell sed awk

我是shell脚本的新手。

我有一个包含表格记录的文件:

“文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5” 文本1:text6:value6" “文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5” 文本1:text6:value6" “文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5” 文本1:text6:value6" “文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5” 文本1:text6:value6"

现在我想编写一个shell脚本来获取某些文本的值字段。 例如: 我想要value2和value5,我知道它们将存在于text2 =和text5 =

之前

整条线上也没有空白。该文件包含n行,我希望每行有2个值(即value2和value5),然后存储在变量中以供进一步处理。

有人可以提供帮助。

谢谢

3 个答案:

答案 0 :(得分:2)

使用sed

while read text2var text5var
do
    #something with text2var and text5var
done < sed 's/.*:text2=\([^,]*\),.*,text5=\([^"]*\)".*/\1 \2/') inputfile

使用GNU AWK(gawk):

while read text2var text5var
do
    #something with text2var and text5var
done < gawk -F ',|:|"' '{sub("[^=]*=","",$3); sub("[^=]*=","",$6); print $3, $6}' inputfile

要使用没有正则表达式的其他版本的AWK,请使用类似于sed命令的正则表达式或使用大量拆分:

while read text2var text5var
do
    #something with text2var and text5var
done < awk -F ',' '{split($1,t2,"text2="); split($4,t5,"\""); split(t5[1],t5,"="); print t2[2], t5[2]}' inputfile

使用cut

while read text2var text5var
do
    #something with text2var and text5var
done < cut -d , -f 1,4 --output-delimiter='=' inputfile | cut -d '"' -f2 | cut -d = -f1,3 | cut -d : -f 2 | cut -d = --output-delimiter=' ' -f1,2 

GNU cut可能需要能够使用--output-delimiter选项。它可能很难看,但至少在每一行都没有被召唤四次。

答案 1 :(得分:1)

我确信可以使用更优雅的解决方案,但是这个bash脚本只是循环输入并过滤掉

  • 第一个=与以下,
  • 之间的值
  • 第四个=和以下"之间的值:

    while read line
    do
        value2=`echo "$line" | cut -d = -f 2 | cut -d , -f 1`
        value5=`echo "$line" | cut -d = -f 5 | cut -d \" -f 1`
        echo $value2 - $value5   # do something with $value2 and $value5
    done
    

您可以像这样调用脚本:

bash myscript.sh < mytextfile.txt

答案 2 :(得分:0)

在命令行中使用q.text中的文本:

gawk -F \“'{print $ 2}'&lt; q.txt | gawk -F:'{print $ 2}'| gawk -F,'{print $ 1”=“$ 4}'| gawk -F = '{print $ 2“,”$ 4}“

尝试使用Cygwin bash,它会起作用。我不是程序员,但我使用cygwin shell,并认为用gawk尝试这样做会很有趣。