Как извлечь только необходимую строку из вывода терминала?

16

Я хочу получить только, скажем, третью строку df -hвывода.

Какую команду я должен использовать?

emrecnl
источник
16
Примечание на будущее: этот вопрос очень очень простой. Обычно рекомендуется проявить определенные усилия и то, что вы пробовали, прежде чем спрашивать.
Сергей Колодяжный
Хотя может быть законным получить 3-ю строку файла с предполагаемым статическим форматом, это отличается от 3-й строки диагностической программы с выходными данными, которые различаются в зависимости от состояния системы. Например, монтирование нового диска / раздела в алфавитном порядке до того, как ваша текущая третья строка его снесет. Таким образом, ответ @ Random832 ниже является лучшим.
MarkHu

Ответы:

31

Это выведет 3-ю строку независимо от содержимого.

df -h | sed -n 3p
Мур
источник
+1 за наименьший ответ: df -h|sed -n 3p.
EKons
16

Команда dfфактически принимает аргумент, идентифицирующий нужную вам файловую систему. Так что вы можете использовать, например, df /homeили df /dev/sda3.

Если вы намереваетесь анализировать выходные данные для скрипта, вы захотите использовать его, df -Pчтобы гарантировать, что он никогда не будет перенесен на несколько строк. Так, например, вы могли бы использовать df -Ph /home | tail -n +2(но если вы анализируете выходные данные для скрипта, помните о возможности имен файлов с пробелами в них)

Random832
источник
2
Это оно! Вместо того, чтобы анализировать вывод, используйте команду, чтобы предоставить именно то, что вы хотите.
Федорки
1
Но ОП сказал, что хочет строку 3. df /homeпредоставляет заголовок. Вы интерпретируете цель пользователя. Вы можете быть правы. Вы можете ошибаться, кто знает?
Майк С
@MikeS Десятка других ответов уже охватывали получение строки 3 без контекста. Я предоставил дополнительную информацию, чтобы у ОП была она, если она ему полезна. И tail -n +2удаляет заголовок.
Random832
14

Вы можете использовать комбинацию headи tail:

df -h | head -3 | tail -1

Или

df -h | tail -n +3 | head -1

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

Проверьте man df.

heemayl
источник
4
+1 за упоминание о том, что df может отфильтровать определенные записи
Сергей Колодяжный
2
Действительно, почти всегда лучше отфильтровать сами данные перед передачей во внешние программы.
Зак Мертес
10

Awk - это инструмент для обработки текста, поэтому он подходит для этой задачи

df -h | awk 'NR == 3'
Сергей Колодяжный
источник
6

Я предполагаю, что вы не обязательно ищете третью строку, но для строки, которая либо упоминает определенный диск (например /dev/sda3) или определенную точку монтирования (например /home).

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

Ваш инструмент для этого есть grep.

Например, если вы хотите строку об устройстве /dev/sda3, введите:

df -h | grep '/dev/sda3'

Если вы хотите, чтобы в качестве точки монтирования упоминалась ваша домашняя директория, используйте:

df -h | grep '/home'
Byte Commander
источник
3
Или df -h /dev/sda3или df -h /home(последний работает, даже если это не точка монтирования).
Random832
6

Вы также можете использовать perl:

df -h | perl -ne 'print if $.==3' 

$.Является номер текущей строки, так что вы могли бы напечатать строку Nth с perl -ne 'print if $.==N'.

terdon
источник
1
Вот почему Perl все еще актуален, на мой взгляд. Он сочетает в себе sed и awk со структурированным языком программирования, который (хотя многие скажут, что это действительно очень некрасиво [и я мог бы согласиться]) по крайней мере последовательный и очень полезный для этих коротких однострочников. Спасибо, Тердон. Это почти так же кратко, как в примере с sed, хотя и более многословно.
Майк С
@MikeS рад помочь. Однако, как хакер Perl, я должен отметить, что код Perl настолько же безобразен, как и вы. Хорошие программисты могут писать красивый код на Perl, просто язык не заставляет вас это делать, и это легко не сделать.
Тердон
2

Моей первой идеей была бы конструкция "голова-хвост".

Пример:

df -h | head -3 | tail -1

head -3вызывает остановку вывода после трех строк и tail -1выводит только последнюю строку.

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

Wayne_Yux
источник