вид, но сохраняет строку заголовка наверху

Следующий веб-сайт обеспечивает инструмент, который переведет скидку с цены в HTML:

http://daringfireball.net/projects/markdown/

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

$ wget http://daringfireball.net/projects/downloads/Markdown_1.0.1.zip
$ unzip Markdown_1.0.1.zip
$ cd Markdown_1.0.1/
$ ./Markdown.pl ~/testfile.markdown | html2text

html2text является одним из многих инструментов, которые можно использовать для просмотра форматированного текста HTML из командной строки. Другая опция, если бы Вы хотите немного более хороший вывод, состояла бы в том, чтобы использовать рысь:

$ ./Markdown.pl ~/testfile.markdown | lynx -stdin

Если Вы - emacs пользователь, кто-то записал режим для скидки с цены, которая доступна здесь: http://jblevins.org/projects/markdown-mode/. Это обеспечивает хорошую подсветку синтаксиса как видно в снимке экрана на том веб-сайте.

Все эти инструменты должны быть доступны для slackware.

60
05.05.2014, 02:40
10 ответов

Кража идеи Andy и создание его функция, таким образом, легче использовать:

# print the header (the first line of input)
# and then run the specified command on the body (the rest of the input)
# use it in a pipeline, e.g. ps | body grep somepattern
body() {
    IFS= read -r header
    printf '%s\n' "$header"
    "$@"
}

Теперь я могу сделать:

$ ps -o pid,comm | body sort -k2
  PID COMMAND
24759 bash
31276 bash
31032 less
31177 less
31020 man
31167 man
...

$ ps -o pid,comm | body grep less
  PID COMMAND
31032 less
31177 less
62
27.01.2020, 19:32
  • 1
    ps -C COMMAND может быть более соответствующим, чем grep COMMAND, но это - просто пример. Кроме того, Вы не можете использовать -C если Вы также использовали другую опцию выбора такой как -U. –  Mikel 23.04.2011, 03:51
  • 2
    Или возможно это нужно назвать body? Как в body sort или body grep. Мысли? –  Mikel 23.04.2011, 03:57
  • 3
    Переименованный от header кому: body, потому что Вы делаете действие с телом. Надо надеяться, это имеет больше смысла. –  Mikel 23.04.2011, 04:02
  • 4
    Не забудьте звонить body на всех последующих конвейерных участниках: ps -o pid,comm | body grep less | body sort -k1nr –  bishop 07.11.2016, 22:02
  • 5
    @Tim можно просто записать <foo body sort -k2 или body sort -k2 <foo. Всего один дополнительный символ от того, что Вы хотели. примечание стороны –  Mikel 04.09.2017, 16:49

Можно сохранить заголовок наверху как это с ударом:

command | (read -r; printf "%s\n" "$REPLY"; sort)

Или сделайте это с жемчугом:

command | perl -e 'print scalar (<>); print sort { ... } <>'
39
27.01.2020, 19:32
  • 1
    +1. Стоящий укутывания как оболочка функционируют, я думаю. –  Mikel 23.04.2011, 03:42
  • 2
    +1, любая причина, почему подоболочка предпочтительна, или {} хорошо вместо ()? –  jonderry 23.04.2011, 03:57
  • 3
    IFS= отключает разделение слова при чтении входа. Я не думаю, что это необходимо при чтении в $REPLY. echo развернет Escape обратной косой черты если xpg_echo установлен (не значение по умолчанию); printf более безопасно в этом случае. echo $REPLY без кавычек уплотнит пробел; я думаю echo "$REPLY" должен быть хорошо. read -r необходим, если вход может содержать Escape обратной косой черты. Часть этого могла бы зависеть от версии удара. –  Andy 23.04.2011, 04:50
  • 4
    @Andy: Ничего себе, Вы - правильные, различные правила для read REPLY; echo $REPLY (полосы, ведущие пробелы) и read; echo $REPLY (не делает). –  Mikel 23.04.2011, 05:44
  • 5
    @Andy: IIRC, значение по умолчанию xpg_echo зависит от Вашей системы, например, от Соляриса я думаю это значения по умолчанию к истинному. Поэтому Gilles нравится printf так: это - единственная вещь с предсказуемым поведением. –  Mikel 23.04.2011, 05:47

Hackish, но эффективный: предварительно ожидать 0 ко всем строкам заголовка и 1 ко всем другим строкам перед сортировкой. Разделите первый символ после сортировки.

… |
awk '{print (NR <= 2 ? "0 " : "1 ") $0}' |
sort -k 1 -k… |
cut -b 3-
4
27.01.2020, 19:32

Вот некоторый волшебный шум в линии жемчуга, что можно передать вывод по каналу до вида, почти сохраняют первую строку наверху: perl -e 'print scalar <>, sort <>;'

3
27.01.2020, 19:32

Я нашел хорошую awk версию, которая работает приятно в сценариях:

awk 'NR == 1; NR > 1 {print $0 | "sort -n"}'
26
27.01.2020, 19:32
  • 1
    мне нравится это, но требуется немного объяснения - канал, в awk сценарии. Как это работает? Это звонит sort команда внешне? Кто-либо знает, по крайней мере, о ссылке на страницу, объясняя использование канала в awk? –  Wildcard 07.11.2015, 03:24
  • 2
    @Wildcard можно проверить официальную страницу руководства или эту краткую информацию. –  lapo 02.11.2016, 21:52
[1133231]
0
27.01.2020, 19:32

Я пробовал команду | {голова -1; Сортировать; } и может подтвердить, что действительно все портит. - head читает несколько строк из конвейера, а затем выводит только первую. Таким образом, остальная часть вывода, которую head не прочитала , передается в sort - НЕ остальная часть вывода, начиная со строки 2!

В результате отсутствуют строки (и одна неполная строка!), Которые были в начале вывода вашей команды (за исключением того, что у вас все еще есть первая строка) - факт, который легко подтвердить, добавив вертикальную черту к wc в конце вышеупомянутого конвейера - но это чрезвычайно сложно отследить, если вы этого не знаете! Я потратил не менее 20 минут, пытаясь понять, почему у меня была неполная строка (первые 100 байт или около того обрезаны) в моем выводе, прежде чем решать ее.

В итоге я сделал, что прекрасно работало и не требовало повторного запуска команды:

myfile=$(mktemp)
whatever command you want to run > $myfile

head -1 $myfile
sed 1d $myfile | sort

rm $myfile

Если вам нужно поместить результат в файл, вы можете изменить его на:

myfile=$(mktemp)
whatever command you want to run > $myfile

head -1 $myfile > outputfile
sed 1d $myfile | sort >> outputfile

rm $myfile
2
27.01.2020, 19:32

Просто и понятно!

<command> | head -n 1; <command> | sed 1d | sort <....>
  • sed nd ---> 'n' указывает номер строки, а 'd' означает удаление.
0
27.01.2020, 19:32

Я думаю, это проще всего.

ps -ef | ( head -n 1 ; sort )

или вот это, что возможно быстрее, так как не создается под-оболочка

ps -ef | { head -n 1 ; sort ; }

Другие классные применения

перестановка строк после строки заголовка

cat file.txt |  ( head -n 1 ; shuf )

разворот строк после строки заголовка

cat file.txt |  ( head -n 1 ; tac )
1
27.01.2020, 19:32

Я пришел сюда в поисках решения для команды w . Эта команда показывает подробную информацию о том, кто вошел в систему и что они делают.

Чтобы показать отсортированные результаты, но с заголовками, оставленными наверху (есть 2 строки заголовков), я остановился на:

w | head -n 2; w | tail -n +3 | sort

Очевидно, это запускает команду w дважды и, следовательно, не может подходить для всех ситуаций. Однако, к его преимуществам, его гораздо легче запомнить.

Обратите внимание, что tail -n +3 означает «показать все строки, начиная с 3-го» (подробности см. В man tail ).

0
27.01.2020, 19:32

Теги

Похожие вопросы