2017-10-09 85 views
0

UPDATE: 现在我有一个简单的文件来处理,与此类似:设置一个awk,sed的输出中的变量猛砸

127.0.0.1 25 127.0.0.1 
127.0.0.1 25 127.0.0.1 
127.0.0.1 32828 127.0.0.1 
127.0.0.1 32830 127.0.0.1 
127.0.0.1 32906 127.0.0.1 
127.0.0.1 32908 127.0.0.1 
127.0.0.1 32984 127.0.0.1 

(第一列ip_local,第二列port_local和最后一列ip_foreign)

我所要做的就是将awk输出发送给一个变量。 我设法编写的代码是这样的,但我仍然有问题,处理文本文件...

#!/bin/sh 
for i in `cat DEV0_IPsListSep.txt`; 
do 
ip_local=$(awk '{print $1}' $i); 
port_local=$(awk '{print $2}' $i); 
ip_foreign=$(awk '{print $3}' $i); 
if [$port_local < 3200] || [$ip_foreign != 127.0.0.1] || [$ip_foreign != 
192.168.1.1] 
then 
echo $ip_foreign >> IPFinalList.txt; 
fi 
done 

我有处理与两列文件的bash脚本。第一列是本地IP地址,另一列是国外地址之一。

例子:

127.0.0.1:25 127.0.0.1:33862 
127.0.0.1:25 127.0.0.1:36498 
127.0.0.1:25 127.0.0.1:37338 
127.0.0.1:25 127.0.0.1:37410 
127.0.0.1:25 127.0.0.1:38320 
127.0.0.1:25 127.0.0.1:39428 
127.0.0.1:25 127.0.0.1:39514 
127.0.0.1:25 127.0.0.1:39768 
127.0.0.1:25 127.0.0.1:39846 
127.0.0.1:25 127.0.0.1:40376 

我想脚本sed和awk命令的输出分配给我的自定义变量,分离的IP和端口。

我试图创建一个脚本,但仍收到语法错误......

#!/bin/sh 

for i in `IPslist.txt`; 

ipLocal=$(awk '{print $1}' | sed -e 's/:.*//' $i) 
portLocal=$(awk '{print $1}' | sed -e 's/.*://' $i) 
ipForeign=$(awk '{print $2}' | sed -e 's/:.*//' $i) 
portForeign=$(awk '{print $2}' | sed -e 's/.*://' $i) 

if [ $portLocal < 3200 ] || [ $ipForeign != 127.0.0.1 ] || [ 
$ipForeign != 192.168.1.1 ] 

then 

echo $ipForeign >> IPFinalList.txt 

fi 

回答

0

采用单AWK过程(优化的解决方案):

awk -F':|[[:space:]]+' '$2<3200 || $3!= 127.0.0.1 || $3!= 192.168.1.1' IPslist.txt > IPFinalList.txt 
+0

嗨罗马,我感谢您的帮助! 我不知道这是否是我的问题的解决方案。这个awk命令的输出与源文件相同;打印符合if ... – Dandelion

+0

@Dandelion条件的所有IP(第一列)会很有趣,这很明显:如果[$ portLocal <3200] || [$ ipForeign!= 127.0.0.1] || [ $ ipForeign!= 192.168.1.1]'涵盖了所有输入行,即所有当前的输入行符合您的条件。否则,你有一个错误定义条件 – RomanPerekhrest

+0

行!我知道了。但是用你的awk命令,即使用“:”分隔符,我仍然得到不正确的输出。我还尝试获得一个新文件,首先将所有内容分开:示例127.0.0.1 25 127.0.0.1(第一列是本地IP,第二列是本地端口,第三列是外部IP),但我仍然不会不会得到我想要的IP列表,(我在新文件中看到的所有IP列表和端口都与原始文件类似)。 – Dandelion