полномочия Файла Linux для другого пользователя как корень, чтобы читать и выполниться

Краткий ответ: вам нужно сначала исправить исходный ввод, он изначально был непоследовательным, что вызвало проблемы позже, когда вы попытаетесь запустить команды.

Вот подробности того, как это исправить:

Изучите то, что вы опубликовали

Во-первых, давайте посмотрим на проблему. Например, если мы скопируем то, что вы разместили, и сохраним это как original_file.tsv :

35 EAST 23rd Street     SOUTH AFRICA        5   600 5000000     6 
83 NORTH YELLOWLIGHT AVENUE SOUTH AFRICA    4   700 7000000     5 
777 NEW AVENUE  SAUDIA      2   900 5000000     3 
FIVE VISA ROAD      MEXICO      3   300 500000      7 
450 JACKSON BLVD        USA     3   1500    300000      4 
25 QUEENS ROAD SOUTH        SOUTH AFRICA        1   900 400000      3

На первый взгляд это выглядит аккуратно и правильно. К сожалению, когда мы более подробно рассмотрим, используя cat -A , вот так, вы увидите в командной строке:

$ cat -A original_file.tsv
35 EAST 23rd Street^I^ISOUTH AFRICA^I^I5^I600^I5000000^I^I6 $
83 NORTH YELLOWLIGHT AVENUE^ISOUTH AFRICA^I4^I700^I7000000^I^I5 $
777 NEW AVENUE^ISAUDIA^I^I2^I900^I5000000^I^I3 $
FIVE VISA ROAD^I^IMEXICO^I^I3^I300^I500000^I^I7 $
450 JACKSON BLVD^I^IUSA^I^I3^I1500^I300000^I^I4 $
25 QUEENS ROAD SOUTH^I^ISOUTH AFRICA^I^I1^I900^I400000^I^I3$
  • ^ I означает «здесь есть вкладка»
  • $ означает «это конец этой строки»

Это сразу выявляет несоответствия, например:

  • строка 1: 35 EAST 23rd Street tab tab ЮЖНАЯ АФРИКА ...
  • строка 2: 83 NORTH YELLOWLIGHT AVENUE tab SOUTH AFRICA ...

В одной строке есть две вкладки, разделяющие поле 1 и поле 2, в следующей строке только одна вкладка. Это не то же самое в каждой строке.

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

Исправленная версия

Похоже, что единственная проблема, по крайней мере, с учетом этого примера, - это появление двойных вкладок, хотя на самом деле это должна быть одна вкладка. Поэтому вместо ручного редактирования, чтобы очистить это, мы всегда должны пытаться использовать инструменты, где это возможно. Здесь мы можем использовать sed , чтобы очистить его и сохранить результаты в файл, например, мы можем вызвать результаты clean_file.tsv :

$ sed 's/\t\t/\t/g;s/ $//g' original_file.tsv  > clean_file.tsv
  • s / \ t \ t / \ t / g ищет две вкладки и заменяет их одной
  • ; , чтобы разделить несколько команд в аргументе sed
  • s / $ // g , потому что кажется, что там конечный пробел на каком-то конце строк, так что здесь это удаляет его
  • > перенаправление файла для сохранения вывода sed в файл, который мы называем clean_file.tsv

clean_file.tsv выглядит так:

35 EAST 23rd Street SOUTH AFRICA    5   600 5000000 6
83 NORTH YELLOWLIGHT AVENUE SOUTH AFRICA    4   700 7000000 5
777 NEW AVENUE  SAUDIA  2   900 5000000 3
FIVE VISA ROAD  MEXICO  3   300 500000  7
450 JACKSON BLVD    USA 3   1500    300000  4
25 QUEENS ROAD SOUTH    SOUTH AFRICA    1   900 400000  3

Мы можем дважды проверить его согласованность, снова используя cat -A , но теперь на нашем clean_file.tsv :

35 EAST 23rd Street^ISOUTH AFRICA^I5^I600^I5000000^I6$
83 NORTH YELLOWLIGHT AVENUE^ISOUTH AFRICA^I4^I700^I7000000^I5$
777 NEW AVENUE^ISAUDIA^I2^I900^I5000000^I3$
FIVE VISA ROAD^IMEXICO^I3^I300^I500000^I7$
450 JACKSON BLVD^IUSA^I3^I1500^I300000^I4$
25 QUEENS ROAD SOUTH^ISOUTH AFRICA^I1^I900^I400000^I3$

Мы действительно видим, что все теперь согласовано, если бы мы тщательно их подсчитали, теперь в каждой строке такое же количество полей (здесь 6) и такое же количество табуляций (здесь 5), что и разделители полей или разделители полей.

Awk, Sort

Теперь, когда у нас есть clean_file.tsv является входом, который правильно отформатирован, теперь мы можем запустить команду и увидеть:

$ awk '/SOUTH AFRICA/ {print }' clean_file.tsv | sort -t $'\t' -k5,5n
25 QUEENS ROAD SOUTH    SOUTH AFRICA    1       900     400000  3
35 EAST 23rd Street     SOUTH AFRICA    5       600     5000000 6
83 NORTH YELLOWLIGHT AVENUE     SOUTH AFRICA    4       700     7000000 5
  • -F удален по сравнению с вашими исходными командами, потому что -F ] предназначен для указания разделителя полей, здесь не требуется, поскольку awk не выполняет никаких манипуляций с полями и используется здесь только для печати строк, соответствующих ЮЖНАЯ АФРИКА в них
  • - t $ '\ t' задает разделитель полей табуляцией.
  • -k5,5 для сортировки от столбца 5 к столбцу 5, потому что в этом случае вы хотели предпоследний, а столбец 5 здесь предпоследний в этом образце данных с 6 столбцами
  • n означает числовую сортировку. Поскольку по умолчанию используется возрастающий порядок, нам не нужно ничего указывать.

Итак, очистив исходные данные и запустив эти awk и sort , теперь вы сможете найти записи SOUTH AFRICA и отсортировать их по пятое поле по возрастанию.

0
07.08.2018, 13:31
1 ответ

Я вижу два варианта,

  • Запустите службу от имени другого пользователя, но используйте возможности. rootбыл разбит на множество возможностей, если служба написана хорошо (, не обязательно -пытается обеспечить безопасность, но позволяет ядру делать это ), тогда она должна работать с возможностями.
  • Используйте списки управления доступом к файлам со значениями по умолчанию, чтобы добавить другого пользователя с правами чтения (, возможно, записи ).

См. Каковы различные способы установки прав доступа к файлам и т. д. в gnu/linux для получения списка способов, которыми современные Linux делают разрешения.

0
28.01.2020, 04:15

Теги

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