Nextrp [CPP] RU + Many GEOs Игра на карте России | NEXTRP

Быстрая команда Unix для отображения определенных строк в середине файла?

linux bash unix text

314135 просмотра

18 ответа

112655 Репутация автора

Попытка отладить проблему с сервером, и мой единственный файл журнала - это файл журнала 20 ГБ (даже без отметок времени! Почему люди используют System.out.println()для ведения журнала? В работе ?!)

Используя grep, я нашел область файла, на которую я хотел бы взглянуть, строка 347340107.

Кроме того, чтобы делать что-то вроде

head -<$LINENUM + 10> filename | tail -20 

... что потребует headпрочтения первых 347 миллионов строк файла журнала, есть ли быстрая и простая команда, которая бы выводила строки 347340100 - 347340200 (например) на консоль?

обновление Я полностью забыл, что grep может печатать контекст вокруг совпадения ... это хорошо работает. Спасибо!

Автор: matt b Источник Размещён: 10.10.2008 01:51

Ответы (18)


68 плюса

0 Репутация автора

Решение

с GNU-grep вы можете просто сказать

grep --context = 10 ...
Автор: Mathias Weidner Размещён: 10.10.2008 01:55

19 плюса

27271 Репутация автора

Как насчет:

tail -n +347340107 filename | head -n 100

Я не проверял это, но думаю, что это сработает.

Автор: itsmatt Размещён: 10.10.2008 01:58

2 плюса

8128 Репутация автора

При этом sed -e '1,N d; M q'вы будете печатать строки от N + 1 до M. Это, вероятно, немного лучше, так grep -Cкак он не пытается сопоставить линии с шаблоном.

Автор: mweerden Размещён: 10.10.2008 02:05

363 плюса

24718 Репутация автора

Я нашел два других решения, если вы знаете номер строки, но больше ничего (нет возможности grep):

Предполагая, что вам нужны строки от 20 до 40,

sed -n '20,40p;41q' file_name

или же

awk 'FNR>=20 && FNR<=40' file_name
Автор: Sklivvz Размещён: 10.10.2008 02:06

12 плюса

1632 Репутация автора

Сначала я бы разделил файл на несколько таких маленьких

$ split --lines=50000 /path/to/large/file /path/to/output/file/prefix

а затем grep на полученные файлы.

Автор: Luka Marinko Размещён: 10.10.2008 03:13

23 плюса

331807 Репутация автора

Нет, файлы не являются строковыми.

Не существует постоянного способа найти начало строки n в текстовом файле. Вы должны пройти через файл и считать новые строки.

Используйте самый простой / быстрый инструмент, который вам нужен для работы. Для меня использование headимеет гораздо больше смысла, чем grep, так как последнее намного сложнее. Я не говорю « grepмедленно», это действительно не так, но я был бы удивлен, если бы это было быстрее, чем headв этом случае. Это было бы ошибкой, в headосновном.

Автор: unwind Размещён: 15.10.2008 01:55

101 плюса

1382 Репутация автора

# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3,  efficient on large files 

Метод 3 эффективен для больших файлов

самый быстрый способ отображения определенных строк

Автор: WCC Размещён: 28.06.2013 02:35

4 плюса

24570 Репутация автора

Sed должен будет прочитать данные, чтобы посчитать строки. Единственный способ, которым ярлык был бы возможен, был бы контекст / порядок в файле, чтобы работать с ним. Например, если есть строки журнала с предустановленной датой / временем ширины и т. Д., Вы можете использовать утилиту look unix для двоичного поиска в файлах по определенным датам / временам.

Автор: pixelbeat Размещён: 07.08.2013 01:01

12 плюса

286192 Репутация автора

Я предпочитаю просто войти lessи

  • набрав 50%половину файла,
  • 43210G перейти на линию 43210
  • :43210 сделать то же самое

и тому подобное.

Еще лучше: нажмите, vчтобы начать редактирование (в vim, конечно!), В этом месте. Теперь обратите внимание, что vimимеет такие же привязки клавиш!

Автор: sehe Размещён: 07.08.2013 01:16

2 плюса

53 Репутация автора

Основываясь на ответе Sklivvz, вот хорошая функция, которую можно поместить в .bash_aliasesфайл. Это эффективно на больших файлах при печати материала с начала файла.

function middle()
{
    startidx=$1
    len=$2
    endidx=$(($startidx+$len))
    filename=$3

    awk "FNR>=${startidx} && FNR<=${endidx} { print NR\" \"\$0 }; FNR>${endidx} { print \"END HERE\"; exit }" $filename
}
Автор: Keithel Размещён: 03.02.2015 03:34

1 плюс

1733 Репутация автора

Чтобы отобразить строку из <textfile>ее <line#>, просто сделайте это:

perl -wne 'print if $. == <line#>' <textfile>

Если вы хотите более эффективный способ показать диапазон строк с регулярными выражениями - я не буду говорить, почему grep - плохая идея для этого, это должно быть довольно очевидно - это простое выражение покажет вам ваш диапазон в один проход, который вам нужен при работе с ~ 20 ГБ текстовыми файлами:

perl -wne 'print if m/<regex1>/ .. m/<regex2>/' <filename>

(подсказка: если в вашем регулярном выражении есть /что-то вроде m!<regex>!этого)

Это напечатало бы, <filename>начиная со строки, которая совпадает <regex1>до (и включая) строку, которая совпадает <regex2>.

Не нужно волшебника, чтобы увидеть, как несколько настроек могут сделать его еще более мощным.

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

Автор: osirisgothra Размещён: 07.02.2015 02:26

3 плюса

134 Репутация автора

использование

x=`cat -n <file> | grep <match> | awk '{print $1}'`

Здесь вы получите номер строки, где произошло совпадение.

Теперь вы можете использовать следующую команду для печати 100 строк

awk -v var="$x" 'NR>=var && NR<=var+100{print}' <file>

или вы можете использовать «седь», а также

sed -n "${x},${x+100}p" <file>
Автор: Ramana Reddy Размещён: 30.07.2015 11:58

0 плюса

76 Репутация автора

Вы можете попробовать эту команду:

egrep -n "*" <filename> | egrep "<line number>"
Автор: Fritz Dodoo Размещён: 22.10.2015 03:26

0 плюса

751 Репутация автора

Легко с Perl! Если вы хотите получить строки 1, 3 и 5 из файла, скажите / etc / passwd:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
Автор: dagelf Размещён: 23.03.2016 01:37

8 плюса

79957 Репутация автора

Вы можете использовать exкоманду, стандартный редактор Unix (теперь это часть Vim), например

  • отобразить одну строку (например, 2-ую):

    ex +2p -scq file.txt
    

    соответствующий синтаксис sed: sed -n '2p' file.txt

  • диапазон строк (например, 2-5 строк):

    ex +2,5p -scq file.txt
    

    Синтаксис sed: sed -n '2,5p' file.txt

  • от заданной строки до конца (например, с 5-го по конец файла):

    ex +5,p -scq file.txt
    

    Синтаксис sed: sed -n '2,$p' file.txt

  • несколько строк (например, 2-4 и 6-8 строк):

    ex +2,4p +6,8p -scq file.txt
    

    Синтаксис sed: sed -n '2,4p;6,8p' file.txt

Указанные выше команды могут быть протестированы с помощью следующего тестового файла:

seq 1 20 > file.txt

Объяснение:

  • +или -cпосле команды - выполнить команду (vi / vim) после прочтения файла,
  • -s - тихий режим, также использует текущий терминал в качестве выхода по умолчанию,
  • qзатем следует -cкоманда для выхода из редактора (например, добавьте, !чтобы сделать принудительный выход -scq!).
Автор: kenorb Размещён: 07.07.2016 03:51

0 плюса

850 Репутация автора

Я удивлен, что только один другой ответ (Рамана Редди) предложил добавить номера строк к выводу. Следующий поиск ищет требуемый номер строки и окрашивает вывод.

file=FILE
lineno=LINENO
wb="107"; bf="30;1"; rb="101"; yb="103"
cat -n ${file} | { GREP_COLORS="se=${wb};${bf}:cx=${wb};${bf}:ms=${rb};${bf}:sl=${yb};${bf}" grep --color -C 10 "^[[:space:]]\\+${lineno}[[:space:]]"; }
Автор: eel ghEEz Размещён: 09.02.2018 03:50

6 плюса

71 Репутация автора

Получить ack

Установка Ubuntu / Debian:

$ sudo apt-get install ack-grep

Затем запустите:

$ ack --lines=$START-$END filename

Пример:

$ ack --lines=10-20 filename

От $ man ack:

--lines=NUM
    Only print line NUM of each file. Multiple lines can be given with multiple --lines options or as a comma separated list (--lines=3,5,7). --lines=4-7 also works. 
    The lines are always output in ascending order, no matter the order given on the command line.
Автор: Odeyin Размещён: 13.03.2018 12:05

4 плюса

49 Репутация автора

Если ваш номер строки 100 читать

head -100 filename | tail -1
Автор: Roopa Размещён: 20.06.2018 05:12
Вопросы из категории :
32x32