2017-02-03 11 views
0

Hello для назначения я был дан файл, который отформатирован как таковойИспользование фильтров внутри команды вырезать

k2mff:x:32162:30:NJIT Amateur Radio Club:/afs/cad/u/k/2/k2mff:/usr/local/etc/klub/clubshell 
senate:x:32164:30:The NJIT Student Senate:/afs/cad/u/s/e/senate:/usr/local/etc/klub/clubshell 
ge:x:32184:30:Hongya Ge:/afs/cad/u/g/e/ge:/bin/tcsh 
spasovic:x:32186:30:lazar spasovic fac/staff:/afs/cad/u/s/p/spasovic:/bin/csh 
etc...

Я использую команду Grep, чтобы получить смелые поля:

grep "csh" /etc/passwd | cut -d ":" -f 3,5,6 

Мой вопрос, так как команда cut использует разделитель, поле шесть вернется

/afs/cad/u/s/p/spasovic 

есть путь, который я могу получить, особенно для шестого поля, персонажей за последним / в команде cut? Или мне нужно отфильтровать вывод на другую команду?

+0

Grep «CSH»/и т.д./пароль | cut -d ":" -f 3,5,6 | sed 's # /. */## g' может работать для вас –

+0

Или еще лучше, 'awk -F: '$ 7 ~/\/csh $/{print $ 3, $ 5, gensub (". */"," "," g ", $ 6)} '/ etc/passwd'. Или, если у вас нет пользователей, у которых есть домашний каталог, не эквивалентный их имени пользователя - 'awk -F: '$ 7 ~/\/csh $/{print $ 3, $ 5, $ 1}'/etc/passwd' – twalberg

ответ

0

Вы можете использовать способность bash разделить строку на разделителе ($IFS), чтобы получить различные поля и расширение ${var##glob}, чтобы удалить части отдельных полей.

Таким образом, вы можете иметь как:

# read each line and split it into named variables 
while IFS=: read -r name pw uid gid gecos home shell; do 
    # check the part after `/' in $shell 
    if [[ "${shell##*/}" == csh ]]; then 
     # print the fields you want 
     echo "$uid" "$gecos" "${home##*/}" 
    fi 
done < /etc/passwd 

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