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

                              Wikipedia:Vital articles Мазмуну Biography - Өмүр баян Philosophy and psychology - Философия жана психология Religion - Дин Social sciences - Коомдук илимдер Language and literature - Тил жана адабият Science - Илим Technology - Технология Arts and recreation - Искусство жана эс алуу History and geography - Тарых жана география Навигация менюсу

                              Bruxelas-Capital Índice Historia | Composición | Situación lingüística | Clima | Cidades irmandadas | Notas | Véxase tamén | Menú de navegacióneO uso das linguas en Bruxelas e a situación do neerlandés"Rexión de Bruxelas Capital"o orixinalSitio da rexiónPáxina de Bruselas no sitio da Oficina de Promoción Turística de Valonia e BruxelasMapa Interactivo da Rexión de Bruxelas-CapitaleeWorldCat332144929079854441105155190212ID28008674080552-90000 0001 0666 3698n94104302ID540940339365017018237

                              What should I write in an apology letter, since I have decided not to join a company after accepting an offer letterShould I keep looking after accepting a job offer?What should I do when I've been verbally told I would get an offer letter, but still haven't gotten one after 4 weeks?Do I accept an offer from a company that I am not likely to join?New job hasn't confirmed starting date and I want to give current employer as much notice as possibleHow should I address my manager in my resignation letter?HR delayed background verification, now jobless as resignedNo email communication after accepting a formal written offer. How should I phrase the call?What should I do if after receiving a verbal offer letter I am informed that my written job offer is put on hold due to some internal issues?Should I inform the current employer that I am about to resign within 1-2 weeks since I have signed the offer letter and waiting for visa?What company will do, if I send their offer letter to another company