Каково различие между “видом-u” и “видом | uniq”?

Короче говоря, потому что выполнить бит считают особенным; если это не установлено вообще, то файл считается не исполняемым файлом и таким образом не может быть выполнен.

Однако, если даже ОДИН из выполнить битов установлен, корень может и выполнять его.

Наблюдайте:

caleburn: ~/ >cat hello.sh
#!/bin/sh

echo "Hello!"

caleburn: ~/ >chmod 000 hello.sh
caleburn: ~/ >./hello.sh
-bash: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
sudo: ./hello.sh: command not found

caleburn: ~/ >chmod 100 hello.sh
caleburn: ~/ >./hello.sh
/bin/sh: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
Hello!
123
16.05.2013, 17:05
5 ответов

sort | uniq существовавший прежде sort -u, и совместимо с более широким диапазоном систем, хотя почти все современные системы действительно поддерживают -u - это - POSIX. Это - главным образом возврат ко дням когда sort -u не существовал (и люди не склонны изменять свои методы, если способ, которым они знают, продолжает работать, просто посмотрите на ifconfig по сравнению с. ip принятие).

Эти два были, вероятно, объединены, потому что удаление дубликатов в файле требует сортировки (по крайней мере, в стандартном случае), и является случаем чрезвычайно общего использования вида. Это также быстрее внутренне в результате способности сделать обе операции одновременно (и вследствие того, что это не требует IPC между uniq и sort). Особенно, если файл является большим, sort -u будет, вероятно, использовать меньше промежуточных файлов для сортировки данных.

В моей системе я последовательно получаю результаты как это:

$ dd if=/dev/urandom of=/dev/shm/file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 8.95208 s, 11.7 MB/s
$ time sort -u /dev/shm/file >/dev/null

real        0m0.500s
user        0m0.767s
sys         0m0.167s
$ time sort /dev/shm/file | uniq >/dev/null

real        0m0.772s
user        0m1.137s
sys         0m0.273s

Это также не маскирует код возврата sort, который может быть важным (в современных оболочках существуют способы получить это, например, bash $PIPESTATUS массив, но это было не всегда верно).

124
27.01.2020, 19:29
  • 1
    я склонен использовать sort | uniq потому что 9 раз из 10, я на самом деле передаю по каналу к uniq -c. –  Plutor 16.05.2013, 17:16
  • 2
    это sort -u была часть 7-го Выпуска UNIX, приблизительно 1979. Версии sort без поддержки -u действительно архаичны — или были записаны без внимания к фактическому стандарту перед стандартом де-юре POSIX. См. также Вид Переполнения стека и uniq в оболочке Linux с 2010. –  Jonathan Leffler 18.02.2015, 18:34
  • 3
    +1 из-за ip. Это - 2016 и это сообщение в 2013, но я только знаю о ip управляйте теперь. –  dieend 27.05.2016, 05:22
  • 4
    +1 для "9, испытывает таймаут 10, я на самом деле передаю по каналу к uniq -c "(и возможно передающий по каналу еще раз к sort -nr | head ). Я задавался вопросом, к чему эквивалент sort | uniq в Vim, когда я узнал, что Vim имеет :sort u команда. И СЕЗАМ sort -u существует также. –  Zhuoyun Wei 13.10.2017, 10:09
  • 5
    , что существует различие при использовании sort -n | uniq по сравнению с. sort -n -u. Например, запаздывание и ведущие пробелы будет рассматриваться как дубликаты sort -n -u но не первым! echo -e 'test \n test' | sort -n -u возвраты test, но echo -e 'test \n test' | sort -n | uniq возвраты обе строки. –  mxmlnkn 11.01.2018, 01:05

Одно различие - это uniq имеет много полезных дополнительных опций, таких как пропуск полей для сравнения и подсчета количества повторений значения. sort -u отметьте только реализует функциональность неукрашенного uniq команда.

48
27.01.2020, 19:29
  • 1
    +0.49 для полезного ответа, но я формулировал бы его что-то как "Вывод sort -u не может быть передан uniq использовать некоторые полезные опции последнего, такие как пропуск полей для сравнения и подсчета количества повторений". –  l0b0 16.05.2013, 17:10
  • 2
    +1 для возмещения голосующих против, потому что "нет никакого способа сделать это непосредственно от вида", действительно отвечает на вопрос... –  Izkata 16.05.2013, 18:28

С совместимым POSIX sorts и uniqs (GNU uniq в настоящее время не совместимо в том отношении), существует различие в этом sort использует алгоритм сопоставления локали для сравнения, строки (будет обычно использовать strcoll() сравнить строки) в то время как uniq проверки на идентификационные данные значения байта (будет обычно использовать strcmp()) ¹.

Это имеет значение по крайней мере по двум причинам.

  • В некоторых локалях, особенно в системах GNU, существуют различные символы тот вид то же. Например, в en_US.UTF-8 локали в системе GNU, весь ①②③④⑤⑥⑦⑧⑨⑩... символы ² и многие другие сортируют то же, потому что их порядок сортировки не определяется. 0 123 456 789 арабских цифр сортируют то же как свои Восточные арабские относящиеся к Индии дубликаты (٠١٢٣٤٥٦٧٨٩).

    Для sort -u, ① сортирует то же как ② и 0123 то же как ٠١٢٣ так sort -u сохранил бы только одного из каждого, в то время как для uniq (не GNU uniq который использует strcoll() (кроме с -i)), ① отличается от ② и 0123 различных от ٠١٢٣, таким образом, uniq считал бы все 4 уникальными.

  • strcoll может только сравнить строки допустимых символов (поведение не определено согласно POSIX, когда вход имеет последовательности байтов, которые не формируют допустимые символы), в то время как strcmp() не заботится о символах, так как это только делает сравнение от байта к байту. Таким образом, это - другая причина почему sort -u может не дать Вам все уникальные строки, если некоторые из них не формируют действительный текст. sort|uniq, в то время как все еще неуказанный на невводе текста, на практике, более вероятно, даст Вам уникальные строки по этой причине.

Около той тонкости одна вещь, которая не была отмечена до сих пор, является этим uniq сравнивает целую строку лексически, в то время как sort -u выдерживает сравнение на основе спецификации вида, данной на командной строке.

$ printf '%s\n' 'a b' 'a c' | sort -uk 1,1
a b
$ printf '%s\n' 'a b' 'a c' | sort -k 1,1 | uniq
a b
a c

$ printf '%s\n' 0 -0 +0 00 '' | sort -n | uniq
0
-0
+0
00

$ printf '%s\n' 0 -0 +0 00 '' | sort -nu
0

¹ Предыдущие версии спецификации POSIX вызывали беспорядок однако путем списка LC_COLLATE переменная как одно влияние uniq, это было удалено в выпуске 2018 года и поведении, разъясненном после того упомянутого выше обсуждения. Посмотрите соответствующую ошибку группы Остина

² редактирование 2019 года. Они были с тех пор зафиксированы, но более чем 95% кодовых точек Unicode все еще имеют неопределенный порядок с версии 2.30 GNU libc. Можно протестировать с вместо этого, например, в более новых версиях

42
27.01.2020, 19:29

Протокол telnet, описанный в RFC 854 , включает способ отправки внутриполосных команд, состоящий из символа IAC , '\255 ', за которым следует еще несколько байтов. Эти команды могут выполнять такие действия, как отправка прерывания на пульт дистанционного управления, но обычно они используются для отправки опций .

Подробное описание коммутатора, отправляющего опцию terminal type , можно найти в Microsoft Q231866 .

Опция размера окна описана в RFC 1073 . Клиент сначала отправляет свое желание отправить опцию NAWS . Если сервер отвечает DO NAWS , клиент может отправить данные опции NAWS , которые состоят из двух 16-битных значений.

Пример сеанса на терминале 47 row 80 column:

telnet> set options
Will show option processing.
telnet> open localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SENT WILL NAWS
RCVD DO NAWS
SENT IAC SB NAWS 0 80 (80) 0 47 (47)

протокол ssh описан в RFC 4254 . Он состоит из потока сообщений. Одним из таких сообщений является «pty-req» , которое запрашивает псевдотерминал, и его параметры включают высоту и ширину терминала.

byte      SSH_MSG_CHANNEL_REQUEST
uint32    recipient channel
string    "pty-req"
boolean   want_reply
string    TERM environment variable value (e.g., vt100)
uint32    terminal width, characters (e.g., 80)
uint32    terminal height, rows (e.g., 24)
uint32    terminal width, pixels (e.g., 640)
uint32    terminal height, pixels (e.g., 480)
string    encoded terminal modes

Клиенты telnet и ssh перехватят сигнал SIGWINCH , поэтому при изменении размера окна терминала во время сеанса они отправят соответствующее сообщение на сервер с новым размером. Ssh отправляет сообщение об изменении размера окна:

byte      SSH_MSG_CHANNEL_REQUEST
uint32    recipient channel
string    "window-change"
boolean   FALSE
uint32    terminal width, columns
uint32    terminal height, rows
uint32    terminal width, pixels
uint32    terminal height, pixels
-121--28854-

"Если оно работает как клавиатура и имеет тип клавиатуры, оно должно быть клавиатура. "

Это не всегда так. Утилита lsusb извлекает информацию из файла /var/lib/usbutils/usb.ids для поиска идентификаторов поставщиков, идентификаторов продуктов, классов, подклассов и протоколов. Однако обратите внимание, что USB-устройство может имитировать неверный идентификатор (см., например, Rubber Ducky ).

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

/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=HID, Driver=usbhid, 1.5M

Интересная часть в Driver = usbhid , где можно узнать, какой драйвер использует ядро для данного устройства. Классом устройства является HID, что означает устройство человека . В этом случае простая запись lsusb будет выглядеть следующим образом:

Bus 006 Device 002: ID 046d:c050 Logitech, Inc. RX 250 Optical Mouse

046d является идентификатором поставщика, указанным как Logitech, Inc. , и c050 является идентификатором продукта, указанным как RX 250 Оптическая мышь .

Можно grep id-file для проверки этих идентификаторов:

$ grep -P "^046d|c050" /var/lib/usbutils/usb.ids
046d  Logitech, Inc.
        c050  RX 250 Optical Mouse
-121--108385-

Я предпочитаю использовать sort | uniq , потому что когда я пытаюсь использовать опцию -u (устранить дубликаты) для удаления дубликатов, связанных со смешанными последовательностями вариантов, не так просто понять результат.

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

LC_ALL=C
export LC_ALL

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

$ cat short      #file to sort
Pear
Pear
apple
pear
Apple

$ sort short     #normal sort (in normal C collating sequence)
Apple            #the lower case words are at the end
Pear
Pear
apple
pear

$ sort -f short  #correctly sorts ignoring the C collating order
Apple            #but duplicates are still there
apple
Pear
Pear
pear

$ sort -fu short #By adding the -u option to remove duplicates it is 
apple            #difficult to ascertain the logic that sort uses to remove
Pear             #duplicates(i.e., why did it remove pear instead of Pear?)

Эта путаница решается путем отказа от использования опции -u для удаления дубликатов. Использование uniq более предсказуемо. Ниже сначала сортируется и игнорируется регистр, а затем передается в uniq для удаления дубликатов.

$ sort -f short | uniq
Apple
apple
Pear
pear
9
27.01.2020, 19:29

Еще одно различие, которое я обнаружил сегодня, - это сортировка на основе разделителя, где sort -u применяет уникальный флаг только к столбцу, по которому выполняется сортировка.

$ cat input.csv
3,World,1
1,Hello,1
2,Hello,1

$ cat input.csv | sort -t',' -k2 -u
1,Hello,1
3,World,1

$ cat input.csv | sort -t',' -k2 | uniq
1,Hello,1
2,Hello,1
3,World,1
4
27.01.2020, 19:29

Теги

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