{"id":477298,"date":"2022-07-24T09:02:31","date_gmt":"2022-07-24T06:02:31","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/how-to-find-pattern-matches-across-multiple-lines-with-grep\/"},"modified":"2022-07-24T09:02:31","modified_gmt":"2022-07-24T06:02:31","slug":"how-to-find-pattern-matches-across-multiple-lines-with-grep","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/how-to-find-pattern-matches-across-multiple-lines-with-grep\/","title":{"rendered":"#How to Find Pattern Matches Across Multiple Lines With grep"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a38c11483238\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a38c11483238\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-find-pattern-matches-across-multiple-lines-with-grep\/#%E2%80%9CHow_to_Find_Pattern_Matches_Across_Multiple_Lines_With_grep%E2%80%9D\" >&#8220;How to Find Pattern Matches Across Multiple Lines With grep&#8221;<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-find-pattern-matches-across-multiple-lines-with-grep\/#Matching_Across_Multiple_New_Lines_With_grep\" >Matching Across Multiple New Lines With grep<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-find-pattern-matches-across-multiple-lines-with-grep\/#Using_pcre2grep_Instead_Perl-Compatible_grep\" >Using pcre2grep Instead (Perl-Compatible grep)<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"%E2%80%9CHow_to_Find_Pattern_Matches_Across_Multiple_Lines_With_grep%E2%80%9D\"><\/span>&#8220;How to Find Pattern Matches Across Multiple Lines With grep&#8221;<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<div>\n<!-- UNCACHED CONTENT --><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"type:primaryImage alignnone size-full wp-image-4038\" data-pagespeed-no-defer=\"\" src=\"https:\/\/www.howtogeek.com\/wp-content\/uploads\/csit\/2017\/07\/add8ac45.png?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"Bash Shell\" width=\"1400\" height=\"600\"\/><\/p>\n<p><code>grep<\/code>\u00a0is a command line text searching utility that is able to find patterns and strings in files and other types of input. Most matches will match on one line only, but it\u2019s often useful to match across multiple new lines.<\/p>\n<h2 role=\"heading\" aria-level=\"2\"><span class=\"ez-toc-section\" id=\"Matching_Across_Multiple_New_Lines_With_grep\"><\/span>Matching Across Multiple New Lines With grep<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Handling multi-line matches is something <code>grep<\/code>\u00a0struggles with. A better tool for the job is <code>awk<\/code>\u00a0or <code>sed<\/code>, which both handle multi-line input naturally. Using two expressions with a comma in between them will match everything in between those two patterns.<\/p>\n<pre>awk '\/from\/,\/to\/' file&#13;\nsed -n '\/from\/,\/to\/p' file<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-16145\" data-pagespeed-lazy-src=\"https:\/\/www.howtogeek.com\/wp-content\/uploads\/csit\/2022\/03\/0ee76968.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"488\" height=\"173\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>It\u2019s still possible to handle this in <code>grep<\/code>, however, the command is very clunky.<\/p>\n<pre>grep -Pz '(?s)from.*n.*to' test<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-16147\" data-pagespeed-lazy-src=\"https:\/\/www.howtogeek.com\/wp-content\/uploads\/csit\/2022\/03\/e8e909ae.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"601\" height=\"180\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>This does a few things:<\/p>\n<ul>\n<li><code>-P<\/code> Turns on <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/en.wikipedia.org\/wiki\/Perl_Compatible_Regular_Expressions\">Perl Compatible Regex<\/a>.<\/li>\n<li><code>-z<\/code>\u00a0feeds the entire file as one line, with \u201czero bytes\u201d instead of a newline. This allows grep to process the whole thing as one line.<\/li>\n<li><code>(?s)<\/code>\u00a0turns on\u00a0PCRE_DOTALL, which makes the <code>.<\/code>\u00a0character match any character, including newlines.<\/li>\n<li><code>from<\/code>\u00a0is the starting match.<\/li>\n<li><code>.*n.*<\/code>\u00a0will match everything up until <code>to<\/code>, which is the ending match.<\/li>\n<\/ul>\n<p>Overall, this will get it done for <a href=\"https:\/\/buradabiliyorum.com\/en\/category\/download-scripts-themes-apps\/\" data-internallinksmanager029f6b8e52c=\"9\" title=\"Download Scripts &amp; Themes &amp; Apps\" target=\"_blank\" rel=\"noopener\">script<\/a>ing purposes, but it\u2019s quite a lot to remember if you\u2019re typing this out yourself. Also, using the <code>-o<\/code>\u00a0flag to print just the match will also print out a trailing zero byte character, which can cause additional problems.<\/p>\n<h2 role=\"heading\" aria-level=\"2\"><span class=\"ez-toc-section\" id=\"Using_pcre2grep_Instead_Perl-Compatible_grep\"><\/span>Using pcre2grep Instead (Perl-Compatible grep)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Regular <code>grep<\/code>\u00a0isn\u2019t the best tool for the job, and there\u2019s an alternative called <code>pcre2grep<\/code>\u00a0that packs in support for Perl Compatible Regular Expressions out of the box, and is able to match multiline Regex very easily.<\/p>\n<p>It\u2019s probably installed on your system, but if it isn\u2019t, you can get it from your package manager:<\/p>\n<pre>sudo apt install pcre2-utils<\/pre>\n<p>Then, you just need to run it with the <code>-M<\/code>\u00a0parameter.<\/p>\n<pre>pcre2grep -M 'from(n|.)*to' file<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-16149\" data-pagespeed-lazy-src=\"https:\/\/www.howtogeek.com\/wp-content\/uploads\/csit\/2022\/03\/1903fef5.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"641\" height=\"195\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Note that this still requires you to match \u201cnewline or any character\u201d manually with <code>(n|.)*<\/code>\u00a0. Alternatively, you can use the <code>(?s)<\/code>\u00a0trick to turn on PCRE_DOTALL and make the dot character match newlines as well.<\/p>\n<pre>pcre2grep -M '(?s)from.*to' file<\/pre>\n<\/div>\n<p><script>\n setTimeout(function(){\n  !function(f,b,e,v,n,t,s)\n  {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n  n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n  if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n  n.queue=[];t=b.createElement(e);t.async=!0;\n  t.src=v;s=b.getElementsByTagName(e)[0];\n  s.parentNode.insertBefore(t,s) } (window, document,'script',\n  'https:\/\/connect.facebook.net\/en_US\/fbevents.js');\n   fbq('init', '335401813750447');\n   fbq('track', 'PageView');\n  },3000);\n<\/script><\/p>\n<blockquote><p><strong><span style=\"color: #ff6600;\">If you liked the article, do not forget to share it with your friends. Follow us on\u00a0<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/news.google.com\/publications\/CAAqBwgKMLG0nwswvr63Aw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Google News<\/a><\/span>\u00a0too, click on the star and choose us from your favorites.<\/span><\/strong><\/p><\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\">For forums sites go to <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/forum.buradabiliyorum.com\/\" target=\"_blank\" rel=\"noopener\">Forum.BuradaBiliyorum.Com<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\"><strong>If you want to read more like this article, you can visit our <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/en.buradabiliyorum.com\/technology\/\" target=\"_blank\" rel=\"noopener\">Technology category.<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<p><span style=\"color: black;\"><a style=\"color: #ff9900;\" href=\"https:\/\/www.howtogeek.com\/devops\/how-to-find-pattern-matches-across-multiple-lines-with-grep\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;How to Find Pattern Matches Across Multiple Lines With grep&#8221; grep\u00a0is a command line text searching utility that is able to find patterns and strings in files and other types of input. Most matches will match on one line only, but it\u2019s often useful to match across multiple new lines. Matching Across Multiple New Lines&#8230;<\/p>\n","protected":false},"author":1,"featured_media":477299,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.howtogeek.com\/wp-content\/uploads\/csit\/2017\/07\/add8ac45.png?height=200p&trim=2,2,2,2","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-477298","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/477298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/comments?post=477298"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/477298\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/477299"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=477298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=477298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=477298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}