парсинг строки в bash - PullRequest
       16

парсинг строки в bash

2 голосов
/ 06 декабря 2008

У меня есть файл, который имеет одну запись в строке. Каждая строка имеет следующий формат:

 "group:permissions:users" 

Разрешения и пользователи могут иметь несколько значений, разделенных запятыми, например:

 "grp1:create,delete:yo,el,ella" 

Я хочу вернуть следующее:

yo
el
ella

Это то, что я имею до сих пор:

cat file | grep grp1 -w | cut -f3 -d: | cut -d "," -f 2

Это возвращает yo,el.ella, Как мне сделать так, чтобы оно возвращало одно значение на строку?

Ответы [ 2 ]

8 голосов
/ 06 декабря 2008

Вы можете использовать awk с опцией -F для использования: в качестве разделителя полей:

[user@host]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}'
yo,el,ella

Это даст вам только строку пользователя, разделенную запятыми. Затем вы можете делать все, что вы хотите с этой строкой. Если вы хотите буквально печатать каждого пользователя по одному в строке, вы можете использовать tr для замены запятых на новые строки:

[user@host]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}' | tr ',' '\n'
yo
el
ella
1 голос
/ 08 декабря 2008

Вот один из способов сделать это полностью в сценарии оболочки. Вам просто нужно изменить IFS, чтобы разбить «слова» на нужные символы. Примечание. Это не будет обрабатывать экранирование (например, ":" в некоторых форматах файлов).

Это написано, чтобы позволить вам сделать:

cat file | name-of-script

Сценарий:

#!/bin/bash
while IFS=: read group permissions users; do
  if [ "$group" = "grp1" ]; then
    IFS=,
    set -- $users
    while [ $# -ne 0 ]; do
      echo $1
      shift
    done
  fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...