Печать Файла Между Двух Строк с SED и AWK

Из данной заметки Вы узнаете как вывести строки между двух паттернов в bash.

Я покажу как с помощью sed и awk найти и напечатать содержимое файла между двух паттернов.

В качестве примера, я создал следующий файл, который буду использовать для печати текста между строк, содержащих шаблоны.

I Love Linux
***** BEGIN *****
BASH is awesome
BASH is awesome
***** END *****
I Love Linux

Допустим нам необходимо напечатать только текст, который находится между строк, содержащих слова ‘BEGIN’ и ‘END’.

Печать Файла Между Двух Строк с SED

С помощью команды sed мы можем указать начальный шаблон и конечный шаблон, для вывода строк между ними. Синтаксис и пример приведены ниже.

Синтаксис:

sed -n '/StartPattern/,/EndPattern/p' FileName
Опции Описание
-n, —quiet, —silent Отключить автоматический вывод
p Распечатать текущую область шаблона

Пример:

sed -n '/BEGIN/,/END/p' info.txt
***** BEGIN *****
BASH is awesome
BASH is awesome
***** END *****

Печать Файла Между Двух Строк с AWK

Так же, как и для команды sed, мы указываем начальный и конечный шаблоны с помощью команды awk.

Синтаксис:

awk '/StartPattern/,/EndPattern/' FileName

Пример:

awk '/BEGIN/,/END/' info.txt
***** BEGIN *****
BASH is awesome
BASH is awesome
***** END *****

12 Replies to “Печать Файла Между Двух Строк с SED и AWK”

  1. Is it possible to capture multiple occurrances and put each occurrance in separate file ??

    1. Is it possible to capture multiple occurrances and put each occurrance in separate file ??
      Did you find a way? This might help me 🙂

  2. А как распечатать весь текст, исключая эту самую помеченную часть текста?

    1. sed ‘/StartPattern/,/EndPattern/d’

  3. hi, i want to know how to do almost the same things, find words that start and end with the same pattern. for example, find words that start and end with the letter ‘g’, note that each line has only one word

    1. #!/bin/bash
      if [[ $# -eq 1 && -f $1 ]]; then
      for i in $(cat ${1})
      do
      firstChar=»$(echo $i | cut -c1)»
      wordLength=»$(echo -n $i | wc -c)»
      lastChar=»$(echo $i | cut -c${wordLength})»
      if [[ «${firstChar}» = «${lastChar}» ]]; then
      echo «For word \»${i}\» — first and last characters match»
      fi
      done
      fi
      ####################################################################################3
      #!/bin/bash
      if [[ $# -eq 1 && -f $1 ]]; then
      for i in $(cat ${1})
      do
      firstChar=${i:0:1}
      lastChar=${i: -1}
      if [[ «${firstChar}» = «${lastChar}» ]]; then
      echo «For word \»${i}\» — first and last characters match»
      fi
      done
      fi
      ####################################################################################

      awk ‘{f=substr($0,0,1); l=substr($0,length($0),1); if ( f == l ) printf «%s%s\t%s\n», «for word — «, $0,»- first and last characters match» ;}’ input.txt

  4. I have an issue in which my string its not a single string; it is a string with multiple words; in which using the example of sed works great; but not with awk;
    How can I group all that string with awk? I tried to encapsulate the string with «», with { }, with ( ) and nothing works. Here is the example of my sed vs awk:
    — sed ‘/show system | inc Software/,/sh syst | i @@@@@/f’ filename.txt > out_file.txt
    That line works perfect; the strings are «show system | inc Software» and «sh syst | inc @@@@@»

    As for awk it doesnt work
    awk ‘/show system | inc Software/,/sh syst | i @@@@@/’ filename.txt > out_file.txt
    The output file is not what I expect. How can I do that strings to work in that command?

    1. more often than not, we will be completely off in answering questions like this as we don’t know the full use case what you are trying to do. post a sample of your file, and specify what your output need to look like.. that will give right info for someone who might be able to help.

    2. Have you tried scaping the pipe?

      sed ‘/show system \| inc Software/,/sh syst | i @@@@@/f’ filename.txt >

    3. I also think the @@@@@ are supposed to be written other way in the pattern. But I haven’t checked it out.

  5. Hi
    I want to do something similar, but my start pattern is a variable. How I can use replace the Startpattern if it is a variable.
    I tried this
    sed -n ‘/»$StartPattern»/,/EndPattern/p’ FileName
    This didnt work. please help

  6. sed -n ‘/reg/{p;}’ file.txt — please tell me to display the top and bottom line + regular expression

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.