2016-07-17 5 views
1

Я пытаюсь работать над скриптом bash, который проверяет имя пользователя в аргументе скрипта, а затем выводит соответствующие строки из файлов/etc/passwd и/etc/group (а не/etc/теневой файл). В настоящее время я использую цикл if then else для проверки содержимого каталога/etc/* и вывода соответствующей информации. Мое намерение состояло в том, чтобы вывести простую текстовую строку, если пользователь совпадения не найден в двух файлах, таким образом, это значение равно null. Тем не менее, он выводит информацию, которая абсолютно неверна для того, что я ищу. Как новый пользователь для BASH, а linux является общим, я уверен, что сразу есть некоторые вопиющие проблемы. Тем не менее, я пытаюсь учиться.BASH grep script

Любая помощь с кодом моего сценария или точкой в ​​правильном направлении была бы принята с благодарностью. Спасибо.

#! /bin/bash                


USERLOOK='grep -h $USERID ~/etc/* | grep :x:'      

grep $1 ~/etc/*              
if [ -z $1 ]; then               
    echo "User not found."            
else                  
    echo "$USERLOOK"             
fi                   
exit 0 
+0

Вопрос непонятен? Вы хотите ввести имя пользователя в качестве аргумента для скрипта: './script user_to_check'? – sjsam

+0

Вы должны прочитать [quoting] (http://mywiki.wooledge.org/BashGuide/Practices#Quoting) и [подстановка команды] (http://mywiki.wooledge.org/CommandSubstitution). –

+0

@sjsam Да, я хочу иметь функцию скрипта, где я ввожу ./script user_to_check. Если имя пользователя найдено, я хочу вывести все строки, где он был найден, и это было моим аргументом в пользу использования grep. Однако, если имя пользователя не было найдено, я хотел бы повторить это. – NewBashUser226

ответ

2

находит все строки в /etc/passwd или /etc/group, которые содержат введенное имя:

#!/bin/bash 

USERLOOK=$(grep -h "$1" /etc/passwd /etc/group) 

if [ -z "$1" ] || [ -z "${USERLOOK}" ]; then 
    echo "User not found." 
else 
    echo "$USERLOOK" 
fi 
+0

': x:' не будет работать для '/ etc/shadow', и в любом случае вы должны привязать поиск к началу строки, например.'"^$ 1: "' –

+0

Вы можете заменить устаревшие обратные ссылки на '$()' –

+0

Спасибо за ответ. Это определенно работает лучше, чем то, что я изначально имел, однако, я пытался вернуть все строки из обоих файлов, содержащих имя пользователя, которое было введено в аргументы сценария. Кроме того, я вижу некоторые синтаксические ошибки, которые я сделал на основе этого скрипта, поэтому спасибо за это. – NewBashUser226

1

Я хочу иметь функцию сценария, в котором я ввод ./script user_to_check. Если имя пользователя найдено, я хочу вывести все строки , где он был найден ... Однако, если имя пользователя не было найдено, я хотел, чтобы отображал это.

Это может быть так просто, как

#!/bin/bash 
grep "^${1}:" /etc/passwd /etc/group 
[ $? -ne 0 ] && echo "User : ${1} not found" 

Как видно имя пользователя, в начале в обоих /etc/passwd & /etc/group мы разместившего ^ в Grep, чтобы соответствовать вещи в начале и традицией : появляется только после имени пользователя.

запустить скрипт как

./script 'username' 
+0

use '"^$ 1: "иначе вы могли бы получить пользователя' foobar' при вызове './script foo' –

+0

Спасибо за ответ. Это возвращает значение первого имени пользователя. Тем не менее, я пытаюсь вернуть все строки, содержащие имя пользователя, которое было введено, таким образом, мои первоначальные аргументы в пользу использования grep. – NewBashUser226

+0

@ NewBashUser226: Смотрите обновление –

0

Стоп, вы думаете об этом все неправильно.

UNIX-оболочка - это среда, из которой можно вызвать инструменты UNIX с языком для последовательности этих вызовов, вот и все. Универсальный инструмент UNIX для управления текстом - awk. Поэтому, если вам нужно искать текст в файле и иметь логику управления, чтобы что-либо с ним делать, это должен быть скрипт awk, а не сценарий оболочки. Раковины роль просто уравнять AWK, что-то вроде этого:

awk -v user="$1" ' 
$0 ~ user { line = $0 } 
END { print (line != "" ? line : "User not found") } 
' /etc/passwd /etc/group 

, но обратите внимание, что это тривиальное с AWK, чтобы сфокусировать поиск только на одном поле, даже другое поле для каждого файла, в отличие от, как это трудно в целом с grep.

Смежные вопросы