LINUX.ORG.RU

Почему не работает cut?

 ,


0

1

Вроде как утилита cut должна выделять поля из строки.

Пообую ее использовать так:

ls -ls /usr/share | cut -f 4

И вместо того чтобы показать группу, никакого выделения поля не происходит:
итого 1180
 4 drwxr-xr-x    3 root root  4096 апр 11 13:58 accountsservice
 4 drwxr-xr-x    2 root root  4096 апр 11 16:51 aclocal
 4 drwxr-xr-x    2 root root  4096 апр 11 13:43 adduser
 4 drwxr-xr-x   10 root root  4096 апр 11 13:56 alsa
...

Что еще нужно сделать чтобы заработал cut?

★★★★★

Сделать то, чего ты обычно не делаешь - прочитать ман программы. Разделитель укажи.

Entmatix ()

Разделитель по умолчанию «таб».

~ % ls -l /usr/share | cut -w -f 4 | head

wheel
wheel
wheel
wheel
wheel
wheel
wheel
wheel
wheel
beastie ★★★★★ ()

По умолчанию в качестве разделителя используется символ табуляции, а у тебя в выводе команды ls ни одного такого символа нет.

Чтобы оно заработало, укажи разделитель.

Aceler ★★★★★ ()
Последнее исправление: Aceler (всего исправлений: 1)
Ответ на: комментарий от Aceler

Если я укажу разделитель пробел, то начинает считаться, что каждое поле начинается после каждого пробела. А не после группы пробелов.

Xintrea ★★★★★ ()
Ответ на: комментарий от Aceler

То есть, беру даже одну строку:

> ls -la /usr/share | grep '.*\sxxkb$'
drwxr-xr-x    2 root root  4096 апр 11 13:58 xxkb

Пытаюсь взять поле, дополнив команду:
> ls -la /usr/share | grep '.*\sxxkb$' | cut -d ' ' -f 3

В ответ пусто.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Посчитай пробелы руками и выбери правильную группу. Или сделай сначала tr. Или восьми awk, или возьми sed.

Лучше конечно смени область деятельности - но этому совету уже лет 10, а ты по прежнему предлагаешь разжевывать за тебя документацию.

aedeph_ ★★ ()
Ответ на: комментарий от aedeph_

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

Давай, я жду.

Xintrea ★★★★★ ()
Ответ на: комментарий от Ja-Ja-Hey-Ho

Awk подходит. Но хотелось бы понять что не так с cut, как ей решить данную задачу. Она ведь для вычленения полей и создавалась.

Xintrea ★★★★★ ()

cut не так работает, как ты думаешь. Он гораздо тупее, тут тебе awk подойдет.

Нужно, как правильно уже писали, задать делитель, -d ' ', например, так задается как делитель пробел. Но cut довольно неочевидно обрабатывает ситуации, когда несколько символов, что обозначены как делитель идут подряд.

Vsevolod-linuxoid ★★★★★ ()
Ответ на: комментарий от Xintrea

Да, для вычленения полей. Но cut не умеет воспринимать несколько символов, что зарегистрированы как разделитель как единое целое, для него они множество разделителей с пустотой между.

То есть разделить на строки конструкцию вида

efjvekj:kfjhwrefk:ekrfjhwe
kewjrbf:erf:ewrfkjh

С его помощью очень даже можно, а вот на

hefhfkjewr        erfnewkfh
lerhfekjwr erfhker
refjherwfkj                     wekljflkerw

Он сломается. Для него 1 пробел и 10 — не одно и то же.

Vsevolod-linuxoid ★★★★★ ()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 2)
Ответ на: комментарий от Xintrea

Вот что нашлось в info cut:

‘-f FIELD-LIST’ ‘–fields=FIELD-LIST’ Select for printing only the fields listed in FIELD-LIST. Fields are separated by a TAB character by default. Also print any line that contains no delimiter character, unless the ‘–only-delimited’ (‘-s’) option is specified.

 Note ‘awk’ supports more sophisticated field processing, like
 reordering fields, and handling fields aligned with blank
 characters.  By default ‘awk’ uses (and discards) runs of blank
 characters to separate fields, and ignores leading and trailing
 blanks.
      awk '{print $2}'      # print the second field
      awk '{print $(NF-1)}' # print the penultimate field
      awk '{print $2,$1}'   # reorder the first two fields
 Note while ‘cut’ accepts field specifications in arbitrary order,
 output is always in the order encountered in the file.

 In the unlikely event that ‘awk’ is unavailable, one can use the
 ‘join’ command, to process blank characters as ‘awk’ does above.
      join -a1 -o 1.2     - /dev/null # print the second field
      join -a1 -o 1.2,1.1 - /dev/null # reorder the first two fields

Т.е. предлагается использовать утилиту join:

ls -la /usr/share | join -a1 -o 1.4 - /dev/null
Ja-Ja-Hey-Ho ★★★ ()
Ответ на: комментарий от Xintrea

Я понимаю, ну значит тебе надо взять более другую утилиту.

Aceler ★★★★★ ()
Ответ на: комментарий от Xintrea

И для решения задачи «выяснить, какая группа у файла X» — тоже вообще другую утилиту.

Например, stat -c %g для GID, stat -c %G для имени группы.

Aceler ★★★★★ ()
Ответ на: комментарий от Xintrea

cut создавалась более 40 лет назад, когда ещё не окончательно положили болт на т.н. «unixway». И вывод разных утилит ещё не был форматирован пробельными символами. А когда начали форматировать, уже были различные способы справиться и с таким выводом. А cut менять не стали, потому что несколько разделителей подряд — это может быть так и задумано, считать несколько разделителей одним в этом случае может всё поломать.

gremlin_the_red ★★★★★ ()
Ответ на: комментарий от gremlin_the_red

Что за эти 40 лет мешало добавить флаг группировки разделителей - совершенно непонятно. Униксвей который мы заслужили.

Xintrea ★★★★★ ()
Ответ на: комментарий от Aceler

И для решения задачи «выяснить, какая группа у файла X» — тоже вообще другую утилиту.

Это я просто как пример приводил. Мне нужно совсем другой вывод парсить.

Xintrea ★★★★★ ()
Ответ на: комментарий от Aceler

Кстати, я думал что это в Astra Linux 1.6 используется утилита cut без опции -w, а она даже в Debian Linux 11 такая же.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

А ненужно никому. У меня в bash_history он не находится, а живёт этот файлик с 2016го года. А в скриптах, где он традиционно и обитает, форматированный вывод обычно не парсят. А если уж парсят, так awk есть. Или sed. Или вон join.

gremlin_the_red ★★★★★ ()
Ответ на: комментарий от Vsevolod-linuxoid

В BSD’шном в данном случае всё в порядке:

     -w      Use whitespace (spaces and tabs) as the delimiter.  Consecutive
             spaces and tabs count as one single field separator.
beastie ★★★★★ ()
Ответ на: комментарий от aedeph_

FreeBSD

Опёнок.

А ты умеешь поднять настроение )) «смена деятельности»? Даёшь видос на пользование утилитами для работы с текстом! На канале поднимем бабки, только надо индуса найти, чтобы всё по феншую.

Oldboy ()

Как ты пять звёзд-то натужил?

u@buildstation:~> ls -ls /usr/share/ | tr -s ' '
total 120
4 drwxr-xr-x 2 root wheel 512 23 окт. 2020 atf
4 drwxr-xr-x 9 root wheel 512 9 дек. 14:03 bsdconfig
4 drwxr-xr-x 12 root wheel 1024 9 дек. 14:03 calendar
4 drwxr-xr-x 4 root wheel 512 23 окт. 2020 certs
4 drwxr-xr-x 2 root wheel 512 9 дек. 14:03 dict
4 drwxr-xr-x 9 root wheel 512 23 окт. 2020 doc
4 drwxr-xr-x 2 root wheel 512 9 дек. 14:03 dtrace
4 drwxr-xr-x 41 root wheel 1024 9 дек. 14:03 examples
4 drwxr-xr-x 2 root wheel 512 23 окт. 2020 firmware
4 drwxr-xr-x 2 root wheel 512 9 дек. 14:03 flua
4 drwxr-xr-x 3 root wheel 512 23 окт. 2020 games
4 drwxr-xr-x 4 root wheel 512 23 окт. 2020 i18n
4 drwxr-xr-x 3 root wheel 512 23 окт. 2020 keys
8 drwxr-xr-x 195 root wheel 4608 9 дек. 14:03 locale
4 drwxr-xr-x 11 root wheel 512 23 апр. 04:15 man
4 drwxr-xr-x 3 root wheel 1024 9 дек. 14:03 misc
4 drwxr-xr-x 2 root wheel 1536 9 дек. 14:03 mk
4 drwxr-xr-x 148 root wheel 3584 23 окт. 2020 nls
4 drwxr-xr-x 3 root wheel 512 23 окт. 2020 openssl
4 drwxr-xr-x 7 root wheel 512 23 окт. 2020 pc-sysinstall
4 drwxr-xr-x 2 root wheel 512 23 окт. 2020 security
4 drwxr-xr-x 3 root wheel 512 23 окт. 2020 sendmail
4 drwxr-xr-x 2 root wheel 512 9 дек. 14:04 skel
4 drwxr-xr-x 4 root wheel 512 23 окт. 2020 snmp
4 drwxr-xr-x 5 root wheel 512 23 окт. 2020 syscons
4 drwxr-xr-x 2 root wheel 512 23 окт. 2020 tabset
4 drwxr-xr-x 3 root wheel 512 23 окт. 2020 vi
4 drwxr-xr-x 4 root wheel 512 23 окт. 2020 vt
4 drwxr-xr-x 19 root wheel 1536 25 марта 11:55 zoneinfo
u@buildstation:~> ls -ls /usr/share/ | tr -s ' ' | cut -d' ' -f4

root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root

IPR ★★★★★ ()
Ответ на: комментарий от Xintrea
u@buildstation:~% ls -ls | tr -s ' ' | cut -d' ' -f10-

Каталог с кучей пробелов
Каталог_без_пробелов

Ты бы мозг пробовал натужить, это не сложно.

IPR ★★★★★ ()
Ответ на: комментарий от IPR

Мда, с понятийным аппаратом у тебя проблемы, болезный. Два пробела друг за другом - это два пробела именно друг за другом. Не разделенные словом, а просто два пробела друг за другом.

Поэтому давай-ка посмотрим на твой любимый tr:

$ ls -ls
итого 4
4 drwxr-xr-x 2 xi xi 4096 апр 29 10:28 Два подряд пробела  смотрим

$ ls -ls | tr -s ' ' | cut -d' ' -f10-
Два подряд пробела смотрим
Ой, а куда пробельчик-то исчез? Имя каталога исказилось... Неожиданно, правда?

Xintrea ★★★★★ ()

Но вот вы обрабатываете всё это чем? Руками? Или таки shell-ами? Всегда смешило, когда пишут V=$(cmd.... | cut -f...) вместо встроенной и достаточно мощной команды read. Более того и ls тут совсем не нужен, for * и как уже намекали - stat тут нужен.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Я уже писал: Почему не работает cut? (комментарий)

Команда ls на самом деле тут не при чем. Просто воинствующие неучи, которые пляшут вокруг ls и tr, не видят, что даже с этими, казалось бы, простыми утилитами будут проблемы с реальными пользовательскими данными.

Xintrea ★★★★★ ()
Ответ на: удаленный комментарий
ls -laQ|cut -d '"' -f 2

Anoxemian ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.