2008-12-05 4 views
2

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

"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, как я могу заставить его вернуть одно значение в строке?

ответ

7

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

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

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

[[email protected]]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}' | tr ',' '\n' 
yo 
el 
ella 
+0

спасибо, что будет делать. она никогда не пересекала мой миг, чтобы использовать awk .... еще раз спасибо – 2008-12-05 23:46:33

1

Вот один из способов сделать это полностью в сценарий оболочки. Вам просто нужно изменить 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