我正在阅读禁令的大型日志文件,从这些禁令中,我想在该行中指定一个名称(请参见下面的John)。然后,我只想打印该行的IP。以下是示例日志文件中的几行内容:
[13:42:51]詹姆斯·普雷斯顿(IP:11.111.11.11)被约翰取缔
[13:42:51]杰拉德·农夫(IP:222.22.222.22)已被詹姆斯禁止下线
[13:42:51]卢克·帕克(IP:33.33.333.333)被约翰取缔
到目前为止,我可以得到包含“ john”的禁令行,但是我想从这些行中提取IP地址。
int main() {
ifstream BanLogs;
BanLogs.open("ban-2019.log");
// Checking to see if the file is open
if (BanLogs.fail()) {
cerr << "ERROR OPENING FILE" << endl;
exit(1);
}
string item;
string name = "john";
int count = 0;
//read a file till the end
while (getline(BanLogs, item)) {
// If the line (item) contains a certain string (name) proceed.
if (item.find(name) != string::npos) {
cout << item << endl;
count++;
}
}
cout << "Number of lines " << count << endl;
return 0;
}
答案 0 :(得分:2)
由于您是编程新手,因此这是最有效的方法:
size_t startIdx = item.find("(IP: ");
if (startIdx == std::string::npos) continue;
startIdx += 5; // skip the "(IP: " part
size_t endIdx = item.find(')', startIdx + 1);
if (endIdx == std::string::npos) continue;
cout << item.substr(startIdx, endIdx - startIdx) << endl;
使用脚本语言(例如Python)更容易进行此类工作。
答案 1 :(得分:0)
如评论中所述,regular expressions是一种选择。
另一种方法是使用已经用于选择相关行的std::string::find
。您对"(IP:"
进行云搜索以获取地址的起始位置(实际起始位置是std::string::find
的结果加上搜索字符串长度的4)。然后,您可以搜索")"
以获取IP地址在字符串中的结束位置。使用这两个位置,您可以使用std::string::substr
提取包含IP地址的子字符串。