Most powerful examples of Unix commands or scripts every programmer should know

后端 未结 25 1531
遇见更好的自我
遇见更好的自我 2021-01-29 18:14

There are many things that all programmers should know, but I am particularly interested in the Unix/Linux commands that we should all know. For accomplishing tasks that we may

25条回答
  •  猫巷女王i
    2021-01-29 18:49

    Some way to search (multiple) badly formatted log files, in which the search string may be found on an "orphaned" next line. For example, to display both the 1st, and a concatenated 3rd and 4th line when searching for id = 110375:

    [2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
    [2008-11-08 07:07:02] [INFO] ...; id = 238998; ...
    [2008-11-08 07:07:03] [ERROR] ... caught exception
    ...; id = 110375; ...
    [2008-11-08 07:07:05] [INFO] ...; id = 800612; ...
    

    I guess there must be better solutions (yes, add them...!) than the following concatenation of the two lines using sed prior to actually running grep:

    #!/bin/bash
    
    if [ $# -ne 1 ]
    then
      echo "Usage: `basename $0` id"
      echo "Searches all myproject's logs for the given id"
      exit -1
    fi  
    
    # When finding "caught exception" then append the next line into the pattern
    # space bij using "N", and next replace the newline with a colon and a space
    # to ensure a single line starting with a timestamp, to allow for sorting
    # the output of multiple files:
    ls -rt /var/www/rails/myproject/shared/log/production.* \
      | xargs cat | sed '/caught exception$/N;s/\n/: /g' \
      | grep "id = $1" | sort
    

    ...to yield:

    [2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
    [2008-11-08 07:07:03] [ERROR] ... caught exception: ...; id = 110375; ...
    

    Actually, a more generic solution would append all (possibly multiple) lines that do not start with some [timestamp] to its previous line. Anyone? Not necessarily using sed, of course.

提交回复
热议问题