Показать статистику
0 голосов
от (130 баллов)
редактировать от

Мне нужно поменять местами группы одной зоны с помощью bash

сбиваются пользователи и их группы, например:

drwx------   2 Ted   Alex  62 May  4 02:01 Alex
drwx------   2 Mason Alex  62 May  4 02:01 Mason
drwx------   2 Alex  Alex  62 May  4 02:01 Ted

а скрипт должен из выстроить правильно: 

drwx------   2 Alex   Alex  62 May  4 02:01 Alex
drwx------   2 Mason Mason  62 May  4 02:01 Mason
drwx------   2 Ted  Ted  62 May  4 02:01 Ted
56 просмотров 1 ответов
от (14.9тыс. баллов)
+1

Можете показать пример что бы лучше понять вашу конкретную задачу?

Например, есть файл /etc/group.

Формат файла:

nobody:*:-2:
nogroup:*:-1:
wheel:*:0:root
daemon:*:1:root
kmem:*:2:root
sys:*:3:root
tty:*:4:root
operator:*:5:root
mail:*:6:_teamsserver
bin:*:7:

Что именно в таком файле нужно изменить?

от (130 баллов)
0

сбиваются пользователи и их группы, например:

пользователь:guest-группа:user
пользователь:admin-группа:guest
пользователь:user-группа:admin


а скрипт должен из выстроить правильно: 

пользователь:guest-группа:guest
пользователь:admin-группа:admin     
пользователь:user-группа:user
от (14.9тыс. баллов)
0
Скрипт сейчас сделаем. Но перед тем как давать скрипт, хочу уточнить - почему группы сбиваются? Вы перешли с локальной автризации на какой нибудь LDAP? Каким образом возникла такая проблема?
от (130 баллов)
0
Мы и не уходили с локали, это часть прохождения в лабе! До меня не как не может дойти концепция.
Буду очень признателен любой помощи.
от (14.9тыс. баллов)
0

Есть несколько вариантов решения этой задачи. Предлагаю самый простой (но самый действенный и быстрый).

#!/bin/bash

cat myfile.txt  | cut -d ':' -f 2 | sort > group.tmp
cat myfile.txt  | cut -d ':' -f 3 | sort > user.tmp

paste group.tmp user.tmp > result.txt

Пару слов о том что происходит в скрипте.

Сначала, я создал файл myfile.txt на основе вашего образца:

пользователь:guest-группа:user
пользователь:admin-группа:guest
пользователь:user-группа:admin

Далее, через команду cat перенаправил содержимое в cut что бы выделить группу и юзера и сохранил вывод в двух временных файлах group.tmp и user.tmp

Так как имя пользователя является частью имени группы (guest-группа:user), то я отсортировал вывод в алфавитном порядке через sort.

Далее, осталось только соединить построчно оба временных файла, что я и сделал с помощью утилиты paste в файле result.txt

В итоге вывод моего скрипта будет таким: 

admin-группа admin
guest-группа guest
user-группа user

Вроде, это то что вам нужно? 

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

P.S. если вам нужно слово "пользователь" вначале каждой строки, то достаточно добавить в скрипт sed конструкцию: 

paste group.tmp user.tmp | sed s'/.*/пользователь:&/'g  > result.txt

После чего финальная версия скрипта будет:

#!/bin/bash

cat myfile.txt  | cut -d ':' -f 2 | sort > group.tmp
cat myfile.txt  | cut -d ':' -f 3 | sort > user.tmp

paste group.tmp user.tmp | sed s'/.*/пользователь:&/'g > result.txt

1 Ответ

+1 голос
от (14.9тыс. баллов)
#!/bin/bash

cat myfile.txt  | cut -d ':' -f 2 | sort > group.tmp
cat myfile.txt  | cut -d ':' -f 3 | sort > user.tmp

paste group.tmp user.tmp | sed s'/.*/пользователь:&/'g > result.txt
...