Printing a string when grep does not get a matchGrep 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 --color=auto breaks when ^M is inside colored matchGrep -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 string

Can i hide one of my siamese twins heads in public?

Shortest way to get an EOF Error

Why is coffee provided during big chess events when it contains a banned substance?

Negative feedbacks and "Language smoother"

How can I cut a metal pipe while preserving the wires inside?

SSD or HDD for server

Find closest power of 2 to a specific number

How can demon technology be prevented from surpassing humans?

Proofreading a novel: is it okay to use a question mark with an exclamation mark - "?!"

The colors in Resident Evil 7 are *completely* off

"Shake your head all you like" meaning

Difference between head and tail

"Dear Stack Exchange, I am very disappointed in you" - How to construct a strong opening line in a letter?

I didn't do any exit passport control when leaving Japan. What should I do?

Employer says he needs to delay payment by 3 months due to bureaucracy

Can a character dodge an attack that beats their Armor Class?

How to deal with intolerable behavior of a subordinate?

Can the bass be used instead of drums?

Disrespectful employee going above my head and telling me what to do. I am his manager

Fill a bowl with alphabet soup

Do you say "good game" after a game in which your opponent played poorly?

How does Firefox know my ISP login page?

Did smallpox emerge in 1580?

Move editor name in biblatex bibliography



Printing a string when grep does not get a match


Grep 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 --color=auto breaks when ^M is inside colored matchGrep -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 string






.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



      share|improve this question








      edited Apr 29 at 12:55







      BhushanDhamale

















      asked Apr 29 at 12:50









      BhushanDhamaleBhushanDhamale

      2271 silver badge5 bronze badges




      2271 silver badge5 bronze badges























          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 ' if (/kwd1' 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/4.0/"u003ecc by-sa 4.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



              share|improve this answer








              edited Apr 29 at 13:04

























              answered Apr 29 at 13:01









              pLumopLumo

              7,92115 silver badges36 bronze badges




              7,92115 silver badges36 bronze badges










              • 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



                  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 ' if (/kwd1' 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 ' if (/kwd1' 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 ' if (/kwd1' 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 ' if (/kwd1' 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



                          share|improve this answer










                          answered Apr 29 at 19:16









                          icarusicarus

                          7,8211 gold badge18 silver badges35 bronze badges




                          7,8211 gold badge18 silver badges35 bronze badges































                              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

                              Tamil (spriik) Luke uk diar | Nawigatjuun

                              Align equal signs while including text over equalitiesAMS align: left aligned text/math plus multicolumn alignmentMultiple alignmentsAligning equations in multiple placesNumbering and aligning an equation with multiple columnsHow to align one equation with another multline equationUsing \ in environments inside the begintabularxNumber equations and preserving alignment of equal signsHow can I align equations to the left and to the right?Double equation alignment problem within align enviromentAligned within align: Why are they right-aligned?

                              Training a classifier when some of the features are unknownWhy does Gradient Boosting regression predict negative values when there are no negative y-values in my training set?How to improve an existing (trained) classifier?What is effect when I set up some self defined predisctor variables?Why Matlab neural network classification returns decimal values on prediction dataset?Fitting and transforming text data in training, testing, and validation setsHow to quantify the performance of the classifier (multi-class SVM) using the test data?How do I control for some patients providing multiple samples in my training data?Training and Test setTraining a convolutional neural network for image denoising in MatlabShouldn't an autoencoder with #(neurons in hidden layer) = #(neurons in input layer) be “perfect”?