在文本文件中查找字符串并根据结果执行脚本

在文本文件中查找字符串并根据结果执行脚本

我有一个文件(Data.txt),内容如下:

A=1234597890 B=192.168.1.1

有时B先行,有时只有A或B。

所以,如果我发现:

  A,    Print A content and execute A script
  B,     "    B    "     "    "     B   "
 A&B,    "   A&B   "     "    "     A   "
Neither, Print a error message

现在的问题是A或B中的内容总是不一样!

我不知道哪个是最好使用的命令。

感谢您的帮助并尝试理解我的基本英语:)!

答案1

您可以在 Perl 中执行此操作:

$ perl -lne 'if(/A=([^\s]+)/){print "A : $1"; `scriptA.sh`} 
           if(/B=([^\s]+)/){print "B : $1"; `scriptB.sh`}' Data.txt

解释

  • -lneprint:从每个输入行中删除尾随换行符,并为每个调用添加换行符( -l);逐行读取文件 ( ) 并在每行-n运行由 给出的脚本。-e
  • if(/A=([^\s]+)/){print "A : $1"; `scriptA.sh`}:如果此行匹配A=某些内容,则打印A : something(括号表示该模式已被捕获并现在保存为$1),然后运行scriptA​​。
  • if(/B=([^\s]+)/){print "B : $1"; `scriptB.sh`}: 如上所述,但对于 B.

或者,您可以提取值并解析它们:

$ grep -Po '[AB]=[^\s]+' Data.txt | 
    while IFS="=" read name val; do 
        echo "$name=$val"; 
        [ "$name" = "A" ] && scriptA.sh || scriptB.sh; 
    done

解释

  • grep -Po '[AB]=[^\s]+' Data.txt-P启用PCRE,并且-o将导致grep在不同的行上打印每个匹配项。意思[AB]=[^\s]+是“匹配 A 或 B,然后=,然后尽可能多的非空白字符。其输出是输入文件的完整集合A=fooB=bar每个文件都在自己的行上。
  • while IFS="=" read name val:设置离子输入字段分隔符=并读取两个变量。这意味着$name将是AB$value是与它们相关的值。
  • echo "$name=$val";:打印它们,将格式更改为您喜欢的格式。
  • [ "$name" = "A" ] && scriptA.sh || scriptB.sh;:如果$nameA,则运行scriptA.sh,否则运行scriptB.sh。上面的两个解决方案都假设您要调用的脚本是scriptA.shscriptB.sh并且它们位于您的 $PATH 中。进行相应的编辑。

相关内容