Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用shell脚本读取、比较和保存2个文件(略高于听起来的样子)_Shell_Awk_Sed_Grep - Fatal编程技术网

使用shell脚本读取、比较和保存2个文件(略高于听起来的样子)

使用shell脚本读取、比较和保存2个文件(略高于听起来的样子),shell,awk,sed,grep,Shell,Awk,Sed,Grep,所以,我没有完全得到我以前一直在寻找的答案,所以我们又来了 我正在创建一个脚本,用于根据预定义的黑色IP列表从.csv日志文件中搜索IP 它首先导入日志文件,然后解析其中的IP,然后根据预定义的黑色IP列表搜索解析的IP,最后需要请求用户(如果找到任何结果)将结果保存到导入的原始日志文件中 文件1是代码中IP-output.csv的一个示例 文件2是代码中$filename的示例(原始导入的.csv) 文件1: 107.147.166.60 ,SUSPICIOUS IP 107.147.167.

所以,我没有完全得到我以前一直在寻找的答案,所以我们又来了

我正在创建一个脚本,用于根据预定义的黑色IP列表从.csv日志文件中搜索IP

它首先导入日志文件,然后解析其中的IP,然后根据预定义的黑色IP列表搜索解析的IP,最后需要请求用户(如果找到任何结果)将结果保存到导入的原始日志文件中

文件1是代码中IP-output.csv的一个示例

文件2是代码中$filename的示例(原始导入的.csv)

文件1:

107.147.166.60 ,SUSPICIOUS IP
107.147.167.26 ,SUSPICIOUS IP
108.48.185.186 ,SUSPICIOUS IP
108.51.114.130 ,SUSPICIOUS IP
142.255.102.68 ,SUSPICIOUS IP
文件2:

outlook.office365.com ,174.203.0.118 ,UserLoginFailed
outlook.office365.com ,107.147.166.60 ,UserLoginFailed
outlook.office365.com ,107.147.167.26 ,UserLoginFailed
outlook.office365.com ,174.205.17.24 ,UserLoginFailed
outlook.office365.com ,108.48.185.186 ,UserLoginFailed
outlook.office365.com ,174.226.15.21 ,UserLoginFailed
outlook.office365.com ,108.51.114.130 ,UserLoginFailed
outlook.office365.com ,67.180.23.93 ,UserLoginFailed
outlook.office365.com ,142.255.102.68 ,UserLoginFailed
outlook.office365.com ,164.106.75.235 ,UserLoginFailed
我想将文件2更改为:

outlook.office365.com ,174.203.0.118 ,UserLoginFailed
outlook.office365.com ,107.147.166.60 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,107.147.167.26 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,174.205.17.24 ,UserLoginFailed
outlook.office365.com ,108.48.185.186 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,174.226.15.21 ,UserLoginFailed
outlook.office365.com ,108.51.114.130 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,67.180.23.93 ,UserLoginFailed
outlook.office365.com ,142.255.102.68 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,164.106.75.235 ,UserLoginFailed
这是我创建的脚本:

#!/bin/bash
#
# IP Blacklist Checker
#Import .csv (File within working directory)
echo "Please import a .csv log file to parse/search the IP(s) and UserAgents: "
read filename
#Parsing IPs from .csv log file
echo "Parsing IP(s) from imported log file..."
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' $filename | sort | uniq > IP-list.txt
echo 'Done'
awk 'END {print NR,"IP(s) Found in imported log file"}' IP-list.txt
echo 'IPs found in imported log file:'
cat IP-list.txt
#searches parsed ip's against blacked ip lists
echo 'Searching parsed IP(s) from pre-defined Blacked IP List Databases...'
fgrep -w -f "IP-list.txt" "IPlist.txt" > IP-output.txt
awk 'END {print NR,"IP(s) Found Blacked IP List Databases"}' IP-output.txt
echo 'Suspicious IPs found in Blacked IP List Databases:'
cat IP-output.txt
while true; do
read -p "Do you want to add results to log file?" yn
case $yn in
    [Yy]* ) grep -Ff IP-output.txt $filename | sed 's/$/ ,SUSPICIOUS IP/' > IP-output.csv && awk 'FNR==NR {m[$1]=$0; next} {for (i in m) {match($0,i); val=substr($0, RSTART, RLENGTH); if (val) {sub(val, m[i]); print; next}};} 1' IP-output.csv $filename > $filename; break;;
    [Nn]* ) break;;
    * ) echo "Please answer yes or no.";;
esac
done
echo "Finished searching parsed IP(s) from pre-defined Blacked IP List Databases."
rm IP-list.txt IP-output.csv IP-output.txt 
我导入的日志文件非常长,有15-20列,IPlist.txt(黑色IP)中有15000多个IP。将结果保存到同一个日志文件后,.csv文件变为空,如果以其他名称保存,则所有列都会出现顺序错误,并且“可疑IP”列出现在IP列旁边,我需要它位于最后一列(行尾)

我也不知道如何只在找到任何东西时提示保存文件,而不是只提示未找到任何东西

我得到的结果是:

 outlook.office365.com ,174.203.0.118 ,UserLoginFailed
 outlook.office365.com ,107.147.166.60 ,SUSPICIOUS IP ,UserLoginFailed
 outlook.office365.com ,107.147.167.26 ,SUSPICIOUS IP ,UserLoginFailed
 outlook.office365.com ,174.205.17.24 ,UserLoginFailed
 outlook.office365.com ,108.48.185.186 ,SUSPICIOUS IP ,UserLoginFailed
 outlook.office365.com ,174.226.15.21 ,UserLoginFailed
 outlook.office365.com ,108.51.114.130 ,SUSPICIOUS IP ,UserLoginFailed
 outlook.office365.com ,67.180.23.93 ,UserLoginFailed
 outlook.office365.com ,142.255.102.68 ,SUSPICIOUS IP ,UserLoginFailed
 outlook.office365.com ,164.106.75.235 ,UserLoginFailed

用于操作文本的通用标准UNIX工具是awk:

$ awk '
    BEGIN { FS=OFS=" ," }
    NR==FNR { a[$1]=$2; next }
    { print $0 ($2 in a ? OFS a[$2] : "") }
' file1 file2
outlook.office365.com ,174.203.0.118 ,UserLoginFailed
outlook.office365.com ,107.147.166.60 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,107.147.167.26 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,174.205.17.24 ,UserLoginFailed
outlook.office365.com ,108.48.185.186 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,174.226.15.21 ,UserLoginFailed
outlook.office365.com ,108.51.114.130 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,67.180.23.93 ,UserLoginFailed
outlook.office365.com ,142.255.102.68 ,UserLoginFailed ,SUSPICIOUS IP
outlook.office365.com ,164.106.75.235 ,UserLoginFailed

这确实有效,但当我尝试将结果保存到>$filename时,它将只保存原始的$filename!我不知道那是什么意思。在脚本末尾添加
>file3
,使其成为
awk'script'file1 file2>file3
,输出将保存在
file3
中,而不是打印到stdout。这就是你要找的吗?如果没有,请澄清,不要谈论
$filename
,因为我的脚本中没有该名称的任何变量,所以请确定您指的是什么。这是单独工作并显示结果的,但只要我将>file3添加到它的末尾,它将只保存从文件2到文件3的所有内容,而不是不可能的实际结果。将
>file
添加到UNIX命令的末尾,这样它打印到stdout的内容就可以转到一个文件而不是屏幕上,而不会神奇地改变该命令打印到stdout的内容(除了一些显著的例外,如
ls
,它们专门设计用于在这两种情况下表现不同)。为什么不继续?你还没有回答这个问题。啊,废话,这是同一个问题的第三次迭代(另见)。将此文件作为dup关闭@bruh321不要反复问同一个问题。与试图帮助你获得原始问题答案的人合作。