Announcement

Collapse
No announcement yet.

еще один perl/awk/sed onliner

Collapse

Forum Topic List

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • еще один perl/awk/sed onliner

    чтобы из вот такого текста:

    Code:
    1.CITIZEN KANE (1941)
    2.CASABLANCA (1942)
    3.GODFATHER, THE (1972)
    4.GONE WITH THE WIND (1939)
    5.LAWRENCE OF ARABIA (1962)
    6.WIZARD OF OZ, THE (1939)
    7.GRADUATE, THE (1967)
    8.ON THE WATERFRONT (1954)
    9.SCHINDLER'S LIST (1993)
    10.SINGIN' IN THE RAIN (1952)
    11.IT'S A WONDERFUL LIFE (1946)
    12.SUNSET BOULEVARD (1950)
    13.BRIDGE ON THE RIVER KWAI, THE (1957)
    14.SOME LIKE IT HOT (1959)
    15.STAR WARS (1977)
    16.ALL ABOUT EVE (1950)
    17.AFRICAN QUEEN, THE (1951)
    18.PSYCHO (1960)
    19.CHINATOWN (1974)
    20.ONE FLEW OVER THE CUCKOO'S NEST (1975)
    сделать вот такой текст:
    Code:
    1. Citizen Kane (1941)
    2. Casablanca (1942)
    3. Godfather, The (1972)
    4. Gone With The Wind (1939)
    5. Lawrence Of Arabia (1962)
    6. Wizard Of Oz, The (1939)
    7. Graduate, The (1967)
    8. On The Waterfront (1954)
    9. Schindler's List (1993)
    10. Singin' In The Rain (1952)
    11. It's A Wonderful Life (1946)
    12. Sunset Boulevard (1950)
    13. Bridge On The River Kwai, The (1957)
    14. Some Like It Hot (1959)
    15. Star Wars (1977)
    16. All About Eve (1950)
    17. African Queen, The (1951)
    18. Psycho (1960)
    19. Chinatown (1974)
    20. One Flew Over The Cuckoo's Nest (1975)
    можно использовать следующую команду (можно в одной строке)
    Code:
    perl -pi -e 's/[0-9]{1,3}\./.../'|
    awk '{print FNR "" $0}'|
    sed 's/\.\.\./\.\ /'|
    tr 'A-Z' 'a-z'|
    perl -pe 's/\ (.{0})(.)/\ $1\U$2/g;'

  • #2
    Re: еще один perl/awk/sed onliner

    Как насчёт:
    perl -p -i.bak -w -e "s/^\d+\./$& /; s/\b(\w)(\S*)/\U$1\L$2/g" ulitka.txt

    Под линуксом думаю надо не двойные, а одинарные кавычки.

    Comment


    • #3
      Re: еще один perl/awk/sed onliner

      Отлично работает! И короче в два раза почти

      в линуксе будет вот так:
      Code:
      cat file.txt|perl -p -e 's/^\d+\./$& /; s/\b(\w)(\S*)/\U$1\L$2/g'

      Comment


      • #4
        Re: еще один perl/awk/sed onliner

        Я просто предпочитаю явно задавать расширение для бекапа.
        Ну и бережёного бог бережёт (я про -w :-) ).

        Кстати, вы похоже это в файл загоняете. У меня же чистая строка запуска в шелл.

        Comment


        • #5
          Re: еще один perl/awk/sed onliner

          Originally posted by Valera View Post
          Кстати, вы похоже это в файл загоняете. У меня же чистая строка запуска в шелл.
          нет, это я разбил по стокам, чтобы было виднее, что каждая команда делает, все запускается одной строкой, так же как и у вас.

          кстати, вот вам вопрос другого свойства:
          мне нужно протестировать из скрипта что отвечает telnet по определенному порту, если отвечает то что задано в patterns - говорит что сервис OK, если получает refused - говорит что сервис не OK
          вот как это я сделал:
          Code:
          destIP='xx.xxx.xxx.xxx'
          destPORT='xxxx'
          servPATTERN='bla-bla-bla'
          
          telnetest ()
          {
            (
              sleep 1
              echo "a"
             ) | telnet -e a $destIP $destPORT  2>/dev/null
          }
          
          result=`telnetest |
                  egrep "$servPATTERN"`
          
          if [ -n "$result" ]; then
              echo "Service is ready"
           else
              echo "Service is not ready"
          fi
          для двух описанных случаев все работает прекрасно, то есть если порт явно закрыт/открыт, то работает без проблем, но вот если IP offline, то в этом случае скрипт висит до тех пор пока не отвалится telnet сессия. Как добавить такого рода проверку? Чтоб тоже говорил "Service is not ready"?
          Приходит в голову брать из скрипта его ID и его kill...
          типа:
          Code:
          telnet -e x ulitka.com 25 &
          echo "$!" > t.pid
          kill `cat t.pid`
          что посоветуете?

          Comment


          • #6
            Re: еще один perl/awk/sed onliner

            Originally posted by Ulitka View Post
            нет, это я разбил по стокам, чтобы было виднее, что каждая команда делает, все запускается одной строкой, так же как и у вас.
            Вы запускаете две различные команды. И соединяете их пайпом. Зачем, если это лишнее?
            У меня получается одна программка на перле, которая запускается, открывает файл и делает с ним что нужно.
            Зачем делать сложным то что проще простого? :-)

            Второй вопрос я завтра посмотрю, ладно. Поздно уже, а мне рано просыпаться.

            Comment


            • #7
              Re: еще один perl/awk/sed onliner

              Originally posted by Valera View Post
              У меня получается одна программка на перле, которая запускается, открывает файл и делает с ним что нужно.
              Зачем делать сложным то что проще простого? :-)
              это оттого, что я в перле не очень...

              Comment


              • #8
                Re: еще один perl/awk/sed onliner

                Originally posted by Ulitka View Post
                это оттого, что я в перле не очень...
                Так и я не очень, если честно.

                Посмотрел вашу вторую задачку. Может стоит перед запуском телнета сперва пропинговать адрес, а? ;-) А если пингуется - лезть телнетом.
                У меня подобным образом страничка с сайта дёргается. Вроде работает.

                Comment


                • #9
                  Re: еще один perl/awk/sed onliner

                  Originally posted by Valera View Post
                  Может стоит перед запуском телнета сперва пропинговать адрес, а? ;-) А если пингуется - лезть телнетом.
                  У меня подобным образом страничка с сайта дёргается. Вроде работает.
                  конкретно в этом случае на уровне "железного" firewall запрещен icmp, так что пинговать не получится. Кроме того, по ssh этот сервер доступен только с jump машины. Явно открыты только несколько портов, которые и нужно иногда проверять при помощи telnet...

                  Может бы есть какие-то tricks с telnet, позволяющие ему так же быстро реагировать на DROP как и на REJECT?

                  Comment


                  • #10
                    Re: еще один perl/awk/sed onliner

                    Originally posted by Ulitka
                    конкретно в этом случае на уровне "железного" firewall запрещен icmp, так что пинговать не получится. Кроме того, по ssh этот сервер доступен только с jump машины. Явно открыты только несколько портов, которые и нужно иногда проверять при помощи telnet...

                    Может бы есть какие-то tricks с telnet, позволяющие ему так же быстро реагировать на DROP как и на REJECT?
                    про уловки - man telnet наверное
                    а так - если есть возможность писать в файл, то запуск телнета выносится в отдельный скрипт , в начале работы скрипта файл убивается, потом запускается телнет, полученный ответ анализируется _и_если_он_хороший_ то файл пересоздаётся.
                    скрипт который записывает ответы к скрипту телнета никакого отношения не имеет и просто проверяет файл на наличие, причём если файла нет, то он проверяет его на наличие ещё раз через секунду (а телнет запускается раз в три-четыре секунды). И если файла всё-ещё нет - значит сервиса нет

                    Comment


                    • #11
                      Re: еще один perl/awk/sed onliner

                      Originally posted by Ulitka
                      Может бы есть какие-то tricks с telnet, позволяющие ему так же быстро реагировать на DROP как и на REJECT?
                      Увы, вы уже не про перл, а про сеть в линухе спрашиваете. Меня линукс не любит - два раза пытался два разных дистрибутива поставить, но он жёстко сопротивлялся. Поэтому вряд ли я вам чего подскажу надёжного.

                      Чисто из предположений: найти клиент, которому можно задать таймаут. Под полуосью, кажется, был такой. Найдётся видимо и под линукс.
                      Или из скрипта(-шедулера) форкать телнет. Через какое-то время проверять что всё хорошо. Если нет - прибивать процесс и делать соответствующие выводы.

                      Comment

                      Working...
                      X