...

/

Search Directories and Files With a Grep Utility

Search Directories and Files With a Grep Utility

Learn to search directories and files with a grep utility.

We'll cover the following...

To demonstrate traversing and searching directory structures, we create a simple utility that works like Unix grep. This utility uses recursive_directory_iterator to traverse nested directories and searches files for matches with a regular expression.

How to do it

In this recipe, we write a simple grep that traverses directories to search files with a regular expression:

  • We start with some convenience aliases where match_v is a vector of regular expression match results:

namespace fs = std::filesystem;
using de = fs::directory_entry;
using rdit = fs::recursive_directory_iterator;
using match_v = vector<std::pair<size_t, std::string>>;
  • We continue using our formatter specialization for path objects:

template<>
struct std::formatter<fs::path>: std::formatter<std::string> {
template<typename FormatContext>
auto format(const fs::path& p, FormatContext& ctx) {
return format_to(ctx.out(), "{}", p.string());
}
};
  • We have a simple function for getting regular expression matches from a file:

match_v matches(const fs::path& fpath, const regex& re) {
match_v matches{};
std::ifstream instrm(fpath.string(), std::ios_base::in);
string s;
for(size_t lineno{1}; getline(instrm, s); ++lineno) {
if(std::regex_search(s.begin(), s.end(), re)) {
matches.emplace_back(lineno, move(s));
}
}
return matches;
}

In this function, we open the file with ifstream, read lines from the file with getline(), and match the regular expression with regex_search(). Results are collected in the vector ...