2022-01-04 17:51:06 +01:00
<!doctype html>
<!--
Minimal Mistakes Jekyll Theme 4.24.0 by Michael Rose
Copyright 2013-2020 Michael Rose - mademistakes.com | @mmistakes
Free for personal and commercial use under the MIT license
https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE
-->
< html lang = "en" class = "no-js" >
< head >
< meta charset = "utf-8" >
<!-- begin _includes/seo.html --> < title > Stop cat-pipe’ ing, You Are Doing It Wrong! - Şahin Akkaya’ s Personal Page< / title >
< meta name = "description" content = "cat some_file | grep some_pattern I’ m sure that you run a command something like above at least once if you are using terminal. You know how cat and grep works and you also know what pipe (|) does. So you naturally combine all of these to make the job done. I was also doing it this way. What I didn’ t know is that grep already accepts file as an argument. So the above command could be rewritten as: grep some_pattern some_file" >
< meta name = "author" content = "Şahin Akkaya" >
< meta property = "article:author" content = "Şahin Akkaya" >
< meta property = "og:type" content = "article" >
< meta property = "og:locale" content = "en_US" >
< meta property = "og:site_name" content = "Şahin Akkaya's Personal Page" >
< meta property = "og:title" content = "Stop cat-pipe’ ing, You Are Doing It Wrong!" >
< meta property = "og:url" content = "https://sahinakkaya.dev/2022/01/01/stop-cat-pipeing.html" >
< meta property = "og:description" content = "cat some_file | grep some_pattern I’ m sure that you run a command something like above at least once if you are using terminal. You know how cat and grep works and you also know what pipe (|) does. So you naturally combine all of these to make the job done. I was also doing it this way. What I didn’ t know is that grep already accepts file as an argument. So the above command could be rewritten as: grep some_pattern some_file" >
< meta property = "article:published_time" content = "2022-01-01T15:00:00+00:00" >
< link rel = "canonical" href = "https://sahinakkaya.dev/2022/01/01/stop-cat-pipeing.html" >
< script type = "application/ld+json" >
{
"@context": "https://schema.org",
"@type": "Person",
"name": null,
"url": "https://sahinakkaya.dev/"
}
< / script >
<!-- end _includes/seo.html -->
< link href = "/feed.xml" type = "application/atom+xml" rel = "alternate" title = "Şahin Akkaya's Personal Page Feed" >
<!-- https://t.co/dKP3o1e -->
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< script >
document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js ';
< / script >
<!-- For all browsers -->
< link rel = "stylesheet" href = "/assets/css/main.css" >
< link rel = "preload" href = "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css" as = "style" onload = "this.onload=null;this.rel='stylesheet'" >
< noscript > < link rel = "stylesheet" href = "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css" > < / noscript >
<!-- start custom head snippets -->
<!-- insert favicons. use https://realfavicongenerator.net/ -->
<!-- end custom head snippets -->
< / head >
< body class = "layout--single" >
< nav class = "skip-links" >
< ul >
< li > < a href = "#site-nav" class = "screen-reader-shortcut" > Skip to primary navigation< / a > < / li >
< li > < a href = "#main" class = "screen-reader-shortcut" > Skip to content< / a > < / li >
< li > < a href = "#footer" class = "screen-reader-shortcut" > Skip to footer< / a > < / li >
< / ul >
< / nav >
<!-- [if lt IE 9]>
< div class = "notice--danger align-center" style = "margin: 0;" > You are using an < strong > outdated< / strong > browser. Please < a href = "https://browsehappy.com/" > upgrade your browser< / a > to improve your experience.< / div >
<![endif]-->
< div class = "masthead" >
< div class = "masthead__inner-wrap" >
< div class = "masthead__menu" >
< nav id = "site-nav" class = "greedy-nav" >
< a class = "site-title" href = "/" >
/home/sahin/
< / a >
< ul class = "visible-links" > < li class = "masthead__menu-item" >
< a href = "/" > Home< / a >
< / li > < li class = "masthead__menu-item" >
< a href = "/about/" > About< / a >
< / li > < li class = "masthead__menu-item" >
< a href = "/contact/" > Contact< / a >
< / li > < / ul >
< button class = "search__toggle" type = "button" >
< span class = "visually-hidden" > Toggle search< / span >
< i class = "fas fa-search" > < / i >
< / button >
< button class = "greedy-nav__toggle hidden" type = "button" >
< span class = "visually-hidden" > Toggle menu< / span >
< div class = "navicon" > < / div >
< / button >
< ul class = "hidden-links hidden" > < / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "initial-content" >
< div id = "main" role = "main" >
< div class = "sidebar sticky" >
< div itemscope itemtype = "https://schema.org/Person" >
< div class = "author__avatar" >
< img src = "/assets/images/logo.jpg" alt = "Şahin Akkaya" itemprop = "image" >
< / div >
< div class = "author__content" >
< h3 class = "author__name" itemprop = "name" > Şahin Akkaya< / h3 >
< div class = "author__bio" itemprop = "description" >
< p > A perfectionist who likes to tinker everything until it is just right.< / p >
< / div >
< / div >
< div class = "author__urls-wrapper" >
< button class = "btn btn--inverse" > Follow< / button >
< ul class = "author__urls social-icons" >
< li itemprop = "homeLocation" itemscope itemtype = "https://schema.org/Place" >
< i class = "fas fa-fw fa-map-marker-alt" aria-hidden = "true" > < / i > < span itemprop = "name" > Istanbul, Turkey< / span >
< / li >
2022-01-06 19:15:55 +01:00
< li > < a href = "https://github.com/Asocia" rel = "nofollow noopener noreferrer" > < i class = "fab fa-fw fa-github" aria-hidden = "true" > < / i > < span class = "label" > Asocia< / span > < / a > < / li >
< li > < a href = "https://stackoverflow.com/users/9608759" rel = "nofollow noopener noreferrer" > < i class = "fab fa-fw fa-stack-overflow" aria-hidden = "true" > < / i > < span class = "label" > Asocia< / span > < / a > < / li >
< li > < a href = "https://twitter.com/sahinakkayadev" rel = "nofollow noopener noreferrer" > < i class = "fab fa-fw fa-twitter-square" aria-hidden = "true" > < / i > < span class = "label" > @sahinakkayadev< / span > < / a > < / li >
< li > < a href = "/assets/docs/resume.pdf" rel = "nofollow noopener noreferrer" > < i class = "fas fa-fw fa-id-card" aria-hidden = "true" > < / i > < span class = "label" > Resume< / span > < / a > < / li >
2022-01-04 17:51:06 +01:00
2022-01-06 19:15:55 +01:00
2022-01-04 17:51:06 +01:00
<!--
< li >
< a href = "http://link-to-whatever-social-network.com/user/" itemprop = "sameAs" rel = "nofollow noopener noreferrer" >
< i class = "fas fa-fw" aria-hidden = "true" > < / i > Custom Social Profile Link
< / a >
< / li >
-->
< / ul >
< / div >
< / div >
< / div >
< article class = "page" itemscope itemtype = "https://schema.org/CreativeWork" >
< meta itemprop = "headline" content = "Stop cat-pipe’ ing, You Are Doing It Wrong!" >
< meta itemprop = "description" content = "cat some_file | grep some_patternI’ m sure that you run a command something like above at least once if you are using terminal. You know how cat and grep works and you also know what pipe (|) does. So you naturally combine all of these to make the job done. I was also doing it this way. What I didn’ t know is that grep already accepts file as an argument. So the above command could be rewritten as:grep some_pattern some_file" >
< meta itemprop = "datePublished" content = "2022-01-01T15:00:00+00:00" >
< div class = "page__inner-wrap" >
< header >
< h1 id = "page-title" class = "page__title" itemprop = "headline" > Stop cat-pipe’ ing, You Are Doing It Wrong!
< / h1 >
< p class = "page__meta" >
< span class = "page__meta-date" >
< i class = "far fa-calendar-alt" aria-hidden = "true" > < / i >
< time datetime = "2022-01-01T15:00:00+00:00" > January 1, 2022< / time >
< / span >
< span class = "page__meta-sep" > < / span >
< span class = "page__meta-readtime" >
< i class = "far fa-clock" aria-hidden = "true" > < / i >
2 minute read
< / span >
< / p >
< / header >
< section class = "page__content" itemprop = "text" >
< div class = "language-bash highlighter-rouge" > < div class = "highlight" > < pre class = "highlight" > < code > < span class = "nb" > cat < / span > some_file | < span class = "nb" > grep < / span > some_pattern
< / code > < / pre > < / div > < / div >
< p > I’ m sure that you run a command something like above at least once if you are using terminal. You know how < code class = "language-plaintext highlighter-rouge" > cat< / code > and < code class = "language-plaintext highlighter-rouge" > grep< / code > works and you also know what pipe (< code class = "language-plaintext highlighter-rouge" > |< / code > ) does. So you naturally combine all of these to make the job done. I was also doing it this way. What I didn’ t know is that < code class = "language-plaintext highlighter-rouge" > grep< / code > already accepts file as an argument. So the above command could be rewritten as:< / p >
< div class = "language-bash highlighter-rouge" > < div class = "highlight" > < pre class = "highlight" > < code > < span class = "nb" > grep < / span > some_pattern some_file
< / code > < / pre > < / div > < / div >
< p > … which can make you save a few keystrokes and a few nanoseconds of CPU cycles. Phew! Not a big deal if you are not working files that contains GBs of data, right? I agree but you should still use the latter command because it will help you solve some other problems better. Here is a real life scenario: You want to search for some specific pattern in all the files in a directory.< / p >
< ul >
< li > If you use the first approach, you may end up running commands like this:< / li >
< / ul >
< div class = "language-bash highlighter-rouge" > < div class = "highlight" > < pre class = "highlight" > < code > ❯ < span class = "nb" > ls< / span >
config.lua Git.lua init.lua markdown.lua palette.lua util.lua
diff.lua highlights.lua LSP.lua Notify.lua Treesitter.lua Whichkey.lua
❯ < span class = "nb" > cat < / span > config.lua | < span class = "nb" > grep < / span > light
❯ < span class = "nb" > cat < / span > diff.lua | < span class = "nb" > grep < / span > light
❯ < span class = "nb" > cat < / span > Git.lua | < span class = "nb" > grep < / span > light
❯ < span class = "nb" > cat < / span > highlights.lua | < span class = "nb" > grep < / span > light
Pmenu < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, < span class = "nb" > bg< / span > < span class = "o" > =< / span > C.popup_back < span class = "o" > }< / span > ,
CursorLineNr < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, style < span class = "o" > =< / span > < span class = "s2" > "bold"< / span > < span class = "o" > }< / span > ,
Search < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, < span class = "nb" > bg< / span > < span class = "o" > =< / span > C.search_blue < span class = "o" > }< / span > ,
IncSearch < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, < span class = "nb" > bg< / span > < span class = "o" > =< / span > C.search_blue < span class = "o" > }< / span > ,
❯ < span class = "nb" > cat < / span > init.lua | < span class = "nb" > grep < / span > light
< span class = "nb" > local < / span > highlights < span class = "o" > =< / span > require < span class = "s2" > "onedarker.highlights"< / span >
highlights,
❯ < span class = "c" > # You still have a lot to do :/< / span >
< / code > < / pre > < / div > < / div >
< ul >
< li > If you use the second approach, you will immediately realize that you can send all the files with < code class = "language-plaintext highlighter-rouge" > *< / code > operator and you will finish the job with just one command (2 if you include mandatory < code class = "language-plaintext highlighter-rouge" > ls< / code > :D):< / li >
< / ul >
< div class = "language-bash highlighter-rouge" > < div class = "highlight" > < pre class = "highlight" > < code > ❯ < span class = "nb" > ls< / span >
config.lua Git.lua init.lua markdown.lua palette.lua util.lua
diff.lua highlights.lua LSP.lua Notify.lua Treesitter.lua Whichkey.lua
❯ < span class = "nb" > grep < / span > light < span class = "k" > *< / span >
highlights.lua: Pmenu < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, < span class = "nb" > bg< / span > < span class = "o" > =< / span > C.popup_back < span class = "o" > }< / span > ,
highlights.lua: CursorLineNr < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, style < span class = "o" > =< / span > < span class = "s2" > "bold"< / span > < span class = "o" > }< / span > ,
highlights.lua: Search < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, < span class = "nb" > bg< / span > < span class = "o" > =< / span > C.search_blue < span class = "o" > }< / span > ,
highlights.lua: IncSearch < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, < span class = "nb" > bg< / span > < span class = "o" > =< / span > C.search_blue < span class = "o" > }< / span > ,
init.lua:local highlights < span class = "o" > =< / span > require < span class = "s2" > "onedarker.highlights"< / span >
init.lua: highlights,
LSP.lua: NvimTreeNormal < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, < span class = "nb" > bg< / span > < span class = "o" > =< / span > C.alt_bg < span class = "o" > }< / span > ,
LSP.lua: LirFloatNormal < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray, < span class = "nb" > bg< / span > < span class = "o" > =< / span > C.alt_bg < span class = "o" > }< / span > ,
markdown.lua: markdownIdDelimiter < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray < span class = "o" > }< / span > ,
markdown.lua: markdownLinkDelimiter < span class = "o" > =< / span > < span class = "o" > {< / span > < span class = "nb" > fg< / span > < span class = "o" > =< / span > C.light_gray < span class = "o" > }< / span > ,
palette.lua: light_gray < span class = "o" > =< / span > < span class = "s2" > "#abb2bf"< / span > ,
palette.lua: light_red < span class = "o" > =< / span > < span class = "s2" > "#be5046"< / span > ,
util.lua:local < span class = "k" > function < / span > highlight< span class = "o" > (< / span > group, properties< span class = "o" > )< / span >
util.lua: < span class = "s2" > "highlight"< / span > ,
util.lua: highlight< span class = "o" > (< / span > group, properties< span class = "o" > )< / span >
< / code > < / pre > < / div > < / div >
< p > Isn’ t this neat? You might say that < em > “This is cheating! You are using a wild card, of course it will be easier.”< / em > Well, yes. Technically I could use the same wild card in the first command like < code class = "language-plaintext highlighter-rouge" > cat * | grep light< / code > but:< / p >
< ul >
< li > I figured that out only after using wild card in the second command. So I think it is does not feel natural.< / li >
< li > It is still not giving the same output. Try and see the difference! < a href = "##" title = "You will not be able to see which file contains which line. 'cat' will just concatenate all the input." > *< / a > < / li >
< / ul >
< / section >
< footer class = "page__meta" >
< p class = "page__date" > < strong > < i class = "fas fa-fw fa-calendar-alt" aria-hidden = "true" > < / i > Updated:< / strong > < time datetime = "2022-01-01T15:00:00+00:00" > January 1, 2022< / time > < / p >
< / footer >
< section class = "page__share" >
< a href = "https://twitter.com/intent/tweet?text=Stop+cat-pipe%27ing%2C+You+Are+Doing+It+Wrong%21%20https%3A%2F%2Fsahinakkaya.dev%2F2022%2F01%2F01%2Fstop-cat-pipeing.html" class = "btn btn--twitter" onclick = "window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title = "Share on Twitter" > < i class = "fab fa-fw fa-twitter" aria-hidden = "true" > < / i > < span > Twitter< / span > < / a >
< a href = "https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fsahinakkaya.dev%2F2022%2F01%2F01%2Fstop-cat-pipeing.html" class = "btn btn--facebook" onclick = "window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title = "Share on Facebook" > < i class = "fab fa-fw fa-facebook" aria-hidden = "true" > < / i > < span > Facebook< / span > < / a >
< a href = "https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fsahinakkaya.dev%2F2022%2F01%2F01%2Fstop-cat-pipeing.html" class = "btn btn--linkedin" onclick = "window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title = "Share on LinkedIn" > < i class = "fab fa-fw fa-linkedin" aria-hidden = "true" > < / i > < span > LinkedIn< / span > < / a >
< / section >
< nav class = "pagination" >
< a href = "/2021/12/24/first-blog-post.html" class = "pagination--pager" title = "First blog post
">Previous< / a >
2022-01-05 00:26:12 +01:00
< a href = "/2022/01/04/build-and-deploy-automatically.html" class = "pagination--pager" title = "Automatically Build and Deploy Your Site using GitHub Actions and Webhooks
">Next< / a >
2022-01-04 17:51:06 +01:00
< / nav >
< / div >
< / article >
< div class = "page__related" >
< h4 class = "page__related-title" > You May Also Enjoy< / h4 >
< div class = "grid__wrapper" >
2022-01-05 00:26:12 +01:00
< div class = "grid__item" >
< article class = "archive__item" itemscope itemtype = "https://schema.org/CreativeWork" >
< h2 class = "archive__item-title no_toc" itemprop = "headline" >
< a href = "/2022/01/04/build-and-deploy-automatically.html" rel = "permalink" > Automatically Build and Deploy Your Site using GitHub Actions and Webhooks
< / a >
< / h2 >
< p class = "page__meta" >
< span class = "page__meta-date" >
< i class = "far fa-fw fa-calendar-alt" aria-hidden = "true" > < / i >
< time datetime = "2022-01-04T17:40:00+00:00" > January 4, 2022< / time >
< / span >
< span class = "page__meta-sep" > < / span >
< span class = "page__meta-readtime" >
< i class = "far fa-fw fa-clock" aria-hidden = "true" > < / i >
5 minute read
< / span >
< / p >
< p class = "archive__item-excerpt" itemprop = "description" > In this post I will explain how you can use GitHub to automate the build and deployment processes that you have. I am going to automate the deployment of thi...< / p >
< / article >
< / div >
2022-01-04 17:51:06 +01:00
< div class = "grid__item" >
< article class = "archive__item" itemscope itemtype = "https://schema.org/CreativeWork" >
< h2 class = "archive__item-title no_toc" itemprop = "headline" >
< a href = "/2021/12/24/first-blog-post.html" rel = "permalink" > First blog post
< / a >
< / h2 >
< p class = "page__meta" >
< span class = "page__meta-date" >
< i class = "far fa-fw fa-calendar-alt" aria-hidden = "true" > < / i >
< time datetime = "2021-12-24T23:54:08+00:00" > December 24, 2021< / time >
< / span >
< span class = "page__meta-sep" > < / span >
< span class = "page__meta-readtime" >
< i class = "far fa-fw fa-clock" aria-hidden = "true" > < / i >
3 minute read
< / span >
< / p >
< p class = "archive__item-excerpt" itemprop = "description" > Hello, World!* So here I am and welcome to my first blog. Having a personal space on the Internet has been a dream for me for years and I am happy that it fi…
< / p >
< / article >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "search-content" >
< div class = "search-content__inner-wrap" > < form class = "search-content__form" onkeydown = "return event.key != 'Enter';" >
< label class = "sr-only" for = "search" >
Enter your search term...
< / label >
< input type = "search" id = "search" class = "search-input" tabindex = "-1" placeholder = "Enter your search term..." / >
< / form >
< div id = "results" class = "results" > < / div > < / div >
< / div >
< div id = "footer" class = "page__footer" >
< footer >
<!-- start custom footer snippets -->
<!-- end custom footer snippets -->
< div class = "page__footer-follow" >
< ul class = "social-icons" >
< li > < a href = "/feed.xml" > < i class = "fas fa-fw fa-rss-square" aria-hidden = "true" > < / i > Feed< / a > < / li >
< / ul >
< / div >
< div class = "page__footer-copyright" > © 2022 Şahin Akkaya's Personal Page. Powered by < a href = "https://jekyllrb.com" rel = "nofollow" > Jekyll< / a > & < a href = "https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel = "nofollow" > Minimal Mistakes< / a > .< / div >
2022-01-06 19:15:55 +01:00
< div class = "page__footer-copyright" >
Check out the < a href = "https://github.com/Asocia/sahinakkayadotdev" > code< / a > of this site.
< / div >
2022-01-04 17:51:06 +01:00
< / footer >
< / div >
< script src = "/assets/js/main.min.js" > < / script >
< script src = "/assets/js/lunr/lunr.min.js" > < / script >
< script src = "/assets/js/lunr/lunr-store.js" > < / script >
< script src = "/assets/js/lunr/lunr-en.js" > < / script >
< / body >
< / html >