我有一个文件(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
解释
-lne
print
:从每个输入行中删除尾随换行符,并为每个调用添加换行符(-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=foo
,B=bar
每个文件都在自己的行上。while IFS="=" read name val
:设置离子输入字段分隔符=
并读取两个变量。这意味着$name
将是A
或B
将$value
是与它们相关的值。echo "$name=$val";
:打印它们,将格式更改为您喜欢的格式。[ "$name" = "A" ] && scriptA.sh || scriptB.sh;
:如果$name
是A
,则运行scriptA.sh
,否则运行scriptB.sh
。上面的两个解决方案都假设您要调用的脚本是scriptA.sh
,scriptB.sh
并且它们位于您的 $PATH 中。进行相应的编辑。