Printing a string when grep does not get a matchRedirect grep out to a file does not workGrep a specific word in a single string with repetitionsMatch exact string using grepgrep string where next line does not contain stringHow to use grep when file does not contain the stringGrep -H not always returning file path when two matches are on the same lineHow to grep MATCH colored input?Check if a file contains an exact match string from another file using grepsed or awk or grep to get first dynamic occurence of a stringGrepping string, but include all non-blank lines following each grep match

99 coins into the sacks

Why did Ham the Chimp push levers?

Why doesn't Dany protect her dragons better?

Did any early RISC OS precursor run on the BBC Micro?

Magical Modulo Squares

Using mean length and mean weight to calculate mean BMI?

How do I give a darkroom course without negatives from the attendees?

What is the oldest instrument ever?

The unknown and unexplained in science fiction

What dice to use in a game that revolves around triangles?

What should I use to get rid of some kind of weed in my onions

How long can fsck take on a 30 TB volume?

How to explain intravenous drug abuse to a 6-year-old?

Are there vaccine ingredients which may not be disclosed ("hidden", "trade secret", or similar)?

Can I bring back Planetary Romance as a genre?

Exactly which act of bravery are Luke and Han awarded a medal for?

How can it be that ssh somename works, while nslookup somename does not?

Align a table column at a specific symbol

Two (probably) equal real numbers which are not proved to be equal?

Names of the Six Tastes

Should one save up to purchase a house/condo or maximize their 401(k) first?

How can I test a shell script in a "safe environment" to avoid harm to my computer?

Is the tensor product (of vector spaces) commutative?

How can one see if an address is multisig?



Printing a string when grep does not get a match


Redirect grep out to a file does not workGrep a specific word in a single string with repetitionsMatch exact string using grepgrep string where next line does not contain stringHow to use grep when file does not contain the stringGrep -H not always returning file path when two matches are on the same lineHow to grep MATCH colored input?Check if a file contains an exact match string from another file using grepsed or awk or grep to get first dynamic occurence of a stringGrepping string, but include all non-blank lines following each grep match






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








5















Suppose I have two files which look as follows:



$ cat search_file.txt
This line contains kwd1.
This line contains kwd2.
This line contains no match.
This line contains no match.
This line contains kwd5.


$ cat search_kwd.sh
grep kwd1 search_file.txt
grep kwd2 search_file.txt
grep kwd3 search_file.txt
grep kwd4 search_file.txt
grep kwd5 search_file.txt


When I run search_kwd.sh, I get:



$ sh search_kwd.sh
This line contains kwd1.
This line contains kwd2.
This line contains kwd5.


I want to print a string whenever grep does not get a match. The output would look like:



$ sh search_kwd.sh
This line contains kwd1.
This line contains kwd2.
string
string
This line contains kwd5.


How do I go about doing this in bash?










share|improve this question






























    5















    Suppose I have two files which look as follows:



    $ cat search_file.txt
    This line contains kwd1.
    This line contains kwd2.
    This line contains no match.
    This line contains no match.
    This line contains kwd5.


    $ cat search_kwd.sh
    grep kwd1 search_file.txt
    grep kwd2 search_file.txt
    grep kwd3 search_file.txt
    grep kwd4 search_file.txt
    grep kwd5 search_file.txt


    When I run search_kwd.sh, I get:



    $ sh search_kwd.sh
    This line contains kwd1.
    This line contains kwd2.
    This line contains kwd5.


    I want to print a string whenever grep does not get a match. The output would look like:



    $ sh search_kwd.sh
    This line contains kwd1.
    This line contains kwd2.
    string
    string
    This line contains kwd5.


    How do I go about doing this in bash?










    share|improve this question


























      5












      5








      5








      Suppose I have two files which look as follows:



      $ cat search_file.txt
      This line contains kwd1.
      This line contains kwd2.
      This line contains no match.
      This line contains no match.
      This line contains kwd5.


      $ cat search_kwd.sh
      grep kwd1 search_file.txt
      grep kwd2 search_file.txt
      grep kwd3 search_file.txt
      grep kwd4 search_file.txt
      grep kwd5 search_file.txt


      When I run search_kwd.sh, I get:



      $ sh search_kwd.sh
      This line contains kwd1.
      This line contains kwd2.
      This line contains kwd5.


      I want to print a string whenever grep does not get a match. The output would look like:



      $ sh search_kwd.sh
      This line contains kwd1.
      This line contains kwd2.
      string
      string
      This line contains kwd5.


      How do I go about doing this in bash?










      share|improve this question
















      Suppose I have two files which look as follows:



      $ cat search_file.txt
      This line contains kwd1.
      This line contains kwd2.
      This line contains no match.
      This line contains no match.
      This line contains kwd5.


      $ cat search_kwd.sh
      grep kwd1 search_file.txt
      grep kwd2 search_file.txt
      grep kwd3 search_file.txt
      grep kwd4 search_file.txt
      grep kwd5 search_file.txt


      When I run search_kwd.sh, I get:



      $ sh search_kwd.sh
      This line contains kwd1.
      This line contains kwd2.
      This line contains kwd5.


      I want to print a string whenever grep does not get a match. The output would look like:



      $ sh search_kwd.sh
      This line contains kwd1.
      This line contains kwd2.
      string
      string
      This line contains kwd5.


      How do I go about doing this in bash?







      bash grep






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Apr 29 at 12:55







      BhushanDhamale

















      asked Apr 29 at 12:50









      BhushanDhamaleBhushanDhamale

      2105




      2105




















          3 Answers
          3






          active

          oldest

          votes


















          14














          grep exits with non-zero code when nothing found.



          From man grep:




          Normally the exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred.




          So you can use:



          grep kwd3 search_file.txt || echo "string"





          share|improve this answer




















          • 1





            +1 for the idiomatic use of ||; I was about to suggest if which does the same thing in a clunkier and more unwieldy manner.

            – Draconis
            Apr 29 at 15:54











          • This only tests for one of the examples, not all of them.

            – Monty Harder
            Apr 29 at 17:55


















          0














          To expand on @RoVo's answer, you can use a for loop to iterate over all your queries:



          for term in "kwd1" "kwd2" "kwd3" "kwd4" "kwd5"; do
          grep "$term" search_file.txt || echo "string"`
          done





          share|improve this answer






























            0














            As the requested output seems to have one line of output for each line of input, where the line is just copied if it matches and is replaced if it doesn't, there are better ways to do this than reading the file 5 times and printing out the lines in the order they are found in the search_kwd.sh file rather than the input file.



            Instead you should process the input file 1 line at a time. There are lots of tools that can do this. For example



            #!/bin/sh
            sed -e '/kwd1/p;d
            /kwd2/p;d
            /kwd3/p;d
            /kwd4/p;d
            /kwd5/p;d
            s/.*/string/' search_file.txt


            which says for each of the matching kewwords print out the line, then discard it and move onto the next line. If it gets through all the keywords and none match then change the line to string (and then implicitly print it).



            You could use awk with something like this



             #!/bin/sh
            awk 'kwd2' search+file.txt


            You could have a pure shell implementation



             #!/bin/sh
            while read -r line
            do
            case "$line" in
            (*"kwd1"*|*"kwd2"*|*"kwd3"*|*"kwd4"*|*"kwd5"*) printf '%sn' "$line" ;;
            (*) printf '%sn' "string" ;;
            esac
            done < search_file.txt


            You could use perl, ruby, python, as well.






            share|improve this answer























              Your Answer








              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "106"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f516161%2fprinting-a-string-when-grep-does-not-get-a-match%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              14














              grep exits with non-zero code when nothing found.



              From man grep:




              Normally the exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred.




              So you can use:



              grep kwd3 search_file.txt || echo "string"





              share|improve this answer




















              • 1





                +1 for the idiomatic use of ||; I was about to suggest if which does the same thing in a clunkier and more unwieldy manner.

                – Draconis
                Apr 29 at 15:54











              • This only tests for one of the examples, not all of them.

                – Monty Harder
                Apr 29 at 17:55















              14














              grep exits with non-zero code when nothing found.



              From man grep:




              Normally the exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred.




              So you can use:



              grep kwd3 search_file.txt || echo "string"





              share|improve this answer




















              • 1





                +1 for the idiomatic use of ||; I was about to suggest if which does the same thing in a clunkier and more unwieldy manner.

                – Draconis
                Apr 29 at 15:54











              • This only tests for one of the examples, not all of them.

                – Monty Harder
                Apr 29 at 17:55













              14












              14








              14







              grep exits with non-zero code when nothing found.



              From man grep:




              Normally the exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred.




              So you can use:



              grep kwd3 search_file.txt || echo "string"





              share|improve this answer















              grep exits with non-zero code when nothing found.



              From man grep:




              Normally the exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred.




              So you can use:



              grep kwd3 search_file.txt || echo "string"






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Apr 29 at 13:04

























              answered Apr 29 at 13:01









              RoVoRoVo

              4,599522




              4,599522







              • 1





                +1 for the idiomatic use of ||; I was about to suggest if which does the same thing in a clunkier and more unwieldy manner.

                – Draconis
                Apr 29 at 15:54











              • This only tests for one of the examples, not all of them.

                – Monty Harder
                Apr 29 at 17:55












              • 1





                +1 for the idiomatic use of ||; I was about to suggest if which does the same thing in a clunkier and more unwieldy manner.

                – Draconis
                Apr 29 at 15:54











              • This only tests for one of the examples, not all of them.

                – Monty Harder
                Apr 29 at 17:55







              1




              1





              +1 for the idiomatic use of ||; I was about to suggest if which does the same thing in a clunkier and more unwieldy manner.

              – Draconis
              Apr 29 at 15:54





              +1 for the idiomatic use of ||; I was about to suggest if which does the same thing in a clunkier and more unwieldy manner.

              – Draconis
              Apr 29 at 15:54













              This only tests for one of the examples, not all of them.

              – Monty Harder
              Apr 29 at 17:55





              This only tests for one of the examples, not all of them.

              – Monty Harder
              Apr 29 at 17:55













              0














              To expand on @RoVo's answer, you can use a for loop to iterate over all your queries:



              for term in "kwd1" "kwd2" "kwd3" "kwd4" "kwd5"; do
              grep "$term" search_file.txt || echo "string"`
              done





              share|improve this answer



























                0














                To expand on @RoVo's answer, you can use a for loop to iterate over all your queries:



                for term in "kwd1" "kwd2" "kwd3" "kwd4" "kwd5"; do
                grep "$term" search_file.txt || echo "string"`
                done





                share|improve this answer

























                  0












                  0








                  0







                  To expand on @RoVo's answer, you can use a for loop to iterate over all your queries:



                  for term in "kwd1" "kwd2" "kwd3" "kwd4" "kwd5"; do
                  grep "$term" search_file.txt || echo "string"`
                  done





                  share|improve this answer













                  To expand on @RoVo's answer, you can use a for loop to iterate over all your queries:



                  for term in "kwd1" "kwd2" "kwd3" "kwd4" "kwd5"; do
                  grep "$term" search_file.txt || echo "string"`
                  done






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Apr 29 at 19:04









                  cyberboxstercyberboxster

                  101




                  101





















                      0














                      As the requested output seems to have one line of output for each line of input, where the line is just copied if it matches and is replaced if it doesn't, there are better ways to do this than reading the file 5 times and printing out the lines in the order they are found in the search_kwd.sh file rather than the input file.



                      Instead you should process the input file 1 line at a time. There are lots of tools that can do this. For example



                      #!/bin/sh
                      sed -e '/kwd1/p;d
                      /kwd2/p;d
                      /kwd3/p;d
                      /kwd4/p;d
                      /kwd5/p;d
                      s/.*/string/' search_file.txt


                      which says for each of the matching kewwords print out the line, then discard it and move onto the next line. If it gets through all the keywords and none match then change the line to string (and then implicitly print it).



                      You could use awk with something like this



                       #!/bin/sh
                      awk 'kwd2' search+file.txt


                      You could have a pure shell implementation



                       #!/bin/sh
                      while read -r line
                      do
                      case "$line" in
                      (*"kwd1"*|*"kwd2"*|*"kwd3"*|*"kwd4"*|*"kwd5"*) printf '%sn' "$line" ;;
                      (*) printf '%sn' "string" ;;
                      esac
                      done < search_file.txt


                      You could use perl, ruby, python, as well.






                      share|improve this answer



























                        0














                        As the requested output seems to have one line of output for each line of input, where the line is just copied if it matches and is replaced if it doesn't, there are better ways to do this than reading the file 5 times and printing out the lines in the order they are found in the search_kwd.sh file rather than the input file.



                        Instead you should process the input file 1 line at a time. There are lots of tools that can do this. For example



                        #!/bin/sh
                        sed -e '/kwd1/p;d
                        /kwd2/p;d
                        /kwd3/p;d
                        /kwd4/p;d
                        /kwd5/p;d
                        s/.*/string/' search_file.txt


                        which says for each of the matching kewwords print out the line, then discard it and move onto the next line. If it gets through all the keywords and none match then change the line to string (and then implicitly print it).



                        You could use awk with something like this



                         #!/bin/sh
                        awk 'kwd2' search+file.txt


                        You could have a pure shell implementation



                         #!/bin/sh
                        while read -r line
                        do
                        case "$line" in
                        (*"kwd1"*|*"kwd2"*|*"kwd3"*|*"kwd4"*|*"kwd5"*) printf '%sn' "$line" ;;
                        (*) printf '%sn' "string" ;;
                        esac
                        done < search_file.txt


                        You could use perl, ruby, python, as well.






                        share|improve this answer

























                          0












                          0








                          0







                          As the requested output seems to have one line of output for each line of input, where the line is just copied if it matches and is replaced if it doesn't, there are better ways to do this than reading the file 5 times and printing out the lines in the order they are found in the search_kwd.sh file rather than the input file.



                          Instead you should process the input file 1 line at a time. There are lots of tools that can do this. For example



                          #!/bin/sh
                          sed -e '/kwd1/p;d
                          /kwd2/p;d
                          /kwd3/p;d
                          /kwd4/p;d
                          /kwd5/p;d
                          s/.*/string/' search_file.txt


                          which says for each of the matching kewwords print out the line, then discard it and move onto the next line. If it gets through all the keywords and none match then change the line to string (and then implicitly print it).



                          You could use awk with something like this



                           #!/bin/sh
                          awk 'kwd2' search+file.txt


                          You could have a pure shell implementation



                           #!/bin/sh
                          while read -r line
                          do
                          case "$line" in
                          (*"kwd1"*|*"kwd2"*|*"kwd3"*|*"kwd4"*|*"kwd5"*) printf '%sn' "$line" ;;
                          (*) printf '%sn' "string" ;;
                          esac
                          done < search_file.txt


                          You could use perl, ruby, python, as well.






                          share|improve this answer













                          As the requested output seems to have one line of output for each line of input, where the line is just copied if it matches and is replaced if it doesn't, there are better ways to do this than reading the file 5 times and printing out the lines in the order they are found in the search_kwd.sh file rather than the input file.



                          Instead you should process the input file 1 line at a time. There are lots of tools that can do this. For example



                          #!/bin/sh
                          sed -e '/kwd1/p;d
                          /kwd2/p;d
                          /kwd3/p;d
                          /kwd4/p;d
                          /kwd5/p;d
                          s/.*/string/' search_file.txt


                          which says for each of the matching kewwords print out the line, then discard it and move onto the next line. If it gets through all the keywords and none match then change the line to string (and then implicitly print it).



                          You could use awk with something like this



                           #!/bin/sh
                          awk 'kwd2' search+file.txt


                          You could have a pure shell implementation



                           #!/bin/sh
                          while read -r line
                          do
                          case "$line" in
                          (*"kwd1"*|*"kwd2"*|*"kwd3"*|*"kwd4"*|*"kwd5"*) printf '%sn' "$line" ;;
                          (*) printf '%sn' "string" ;;
                          esac
                          done < search_file.txt


                          You could use perl, ruby, python, as well.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Apr 29 at 19:16









                          icarusicarus

                          6,30111231




                          6,30111231



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Unix & Linux Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f516161%2fprinting-a-string-when-grep-does-not-get-a-match%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Club Baloncesto Breogán Índice Historia | Pavillón | Nome | O Breogán na cultura popular | Xogadores | Adestradores | Presidentes | Palmarés | Historial | Líderes | Notas | Véxase tamén | Menú de navegacióncbbreogan.galCadroGuía oficial da ACB 2009-10, páxina 201Guía oficial ACB 1992, páxina 183. Editorial DB.É de 6.500 espectadores sentados axeitándose á última normativa"Estudiantes Junior, entre as mellores canteiras"o orixinalHemeroteca El Mundo Deportivo, 16 setembro de 1970, páxina 12Historia do BreogánAlfredo Pérez, o último canoneiroHistoria C.B. BreogánHemeroteca de El Mundo DeportivoJimmy Wright, norteamericano do Breogán deixará Lugo por ameazas de morteResultados de Breogán en 1986-87Resultados de Breogán en 1990-91Ficha de Velimir Perasović en acb.comResultados de Breogán en 1994-95Breogán arrasa al Barça. "El Mundo Deportivo", 27 de setembro de 1999, páxina 58CB Breogán - FC BarcelonaA FEB invita a participar nunha nova Liga EuropeaCharlie Bell na prensa estatalMáximos anotadores 2005Tempada 2005-06 : Tódolos Xogadores da Xornada""Non quero pensar nunha man negra, mais pregúntome que está a pasar""o orixinalRaúl López, orgulloso dos xogadores, presume da boa saúde económica do BreogánJulio González confirma que cesa como presidente del BreogánHomenaxe a Lisardo GómezA tempada do rexurdimento celesteEntrevista a Lisardo GómezEl COB dinamita el Pazo para forzar el quinto (69-73)Cafés Candelas, patrocinador del CB Breogán"Suso Lázare, novo presidente do Breogán"o orixinalCafés Candelas Breogán firma el mayor triunfo de la historiaEl Breogán realizará 17 homenajes por su cincuenta aniversario"O Breogán honra ao seu fundador e primeiro presidente"o orixinalMiguel Giao recibiu a homenaxe do PazoHomenaxe aos primeiros gladiadores celestesO home que nos amosa como ver o Breo co corazónTita Franco será homenaxeada polos #50anosdeBreoJulio Vila recibirá unha homenaxe in memoriam polos #50anosdeBreo"O Breogán homenaxeará aos seus aboados máis veteráns"Pechada ovación a «Capi» Sanmartín e Ricardo «Corazón de González»Homenaxe por décadas de informaciónPaco García volve ao Pazo con motivo do 50 aniversario"Resultados y clasificaciones""O Cafés Candelas Breogán, campión da Copa Princesa""O Cafés Candelas Breogán, equipo ACB"C.B. Breogán"Proxecto social"o orixinal"Centros asociados"o orixinalFicha en imdb.comMario Camus trata la recuperación del amor en 'La vieja música', su última película"Páxina web oficial""Club Baloncesto Breogán""C. B. Breogán S.A.D."eehttp://www.fegaba.com

                              Vilaño, A Laracha Índice Patrimonio | Lugares e parroquias | Véxase tamén | Menú de navegación43°14′52″N 8°36′03″O / 43.24775, -8.60070

                              Cegueira Índice Epidemioloxía | Deficiencia visual | Tipos de cegueira | Principais causas de cegueira | Tratamento | Técnicas de adaptación e axudas | Vida dos cegos | Primeiros auxilios | Crenzas respecto das persoas cegas | Crenzas das persoas cegas | O neno deficiente visual | Aspectos psicolóxicos da cegueira | Notas | Véxase tamén | Menú de navegación54.054.154.436928256blindnessDicionario da Real Academia GalegaPortal das Palabras"International Standards: Visual Standards — Aspects and Ranges of Vision Loss with Emphasis on Population Surveys.""Visual impairment and blindness""Presentan un plan para previr a cegueira"o orixinalACCDV Associació Catalana de Cecs i Disminuïts Visuals - PMFTrachoma"Effect of gene therapy on visual function in Leber's congenital amaurosis"1844137110.1056/NEJMoa0802268Cans guía - os mellores amigos dos cegosArquivadoEscola de cans guía para cegos en Mortágua, PortugalArquivado"Tecnología para ciegos y deficientes visuales. Recopilación de recursos gratuitos en la Red""Colorino""‘COL.diesis’, escuchar los sonidos del color""COL.diesis: Transforming Colour into Melody and Implementing the Result in a Colour Sensor Device"o orixinal"Sistema de desarrollo de sinestesia color-sonido para invidentes utilizando un protocolo de audio""Enseñanza táctil - geometría y color. Juegos didácticos para niños ciegos y videntes""Sistema Constanz"L'ocupació laboral dels cecs a l'Estat espanyol està pràcticament equiparada a la de les persones amb visió, entrevista amb Pedro ZuritaONCE (Organización Nacional de Cegos de España)Prevención da cegueiraDescrición de deficiencias visuais (Disc@pnet)Braillín, un boneco atractivo para calquera neno, con ou sen discapacidade, que permite familiarizarse co sistema de escritura e lectura brailleAxudas Técnicas36838ID00897494007150-90057129528256DOID:1432HP:0000618D001766C10.597.751.941.162C97109C0155020