Как я могу показывать в какой линии файла находится данная цепь?

Они просят меня, чтобы делать рукописный шрифт, который просил бы у меня имя пользователя системы, которую я ввожу из-за консоли.

Однажды у него есть имя я должен способствовать тому, чтобы прочитала файл passwd линия из-за линии, и когда найдет пользователь, что я ввел его, скажите мне "Пользователь находится в линии $linea"

То есть я должен делать счетчик, for и if внутри, но оно я не функционирует, что у меня есть, так это это:

#!/bin/bash
echo "Introduce el usuario para saber su posicion"
read user
contador=0
    for lista in `more /etc/passwd`;
    do
        contador=`expr $contador + 1`

        if [ "$user" -eq "$lista" ];
        then
            echo "El usuario $user esta en la linea $contador"
            exit
        else
            echo "El usuario no se encuentra en el sistema"
        fi
    done
2
задан 26.09.2018, 01:52
2 ответа

В ¿ Có mo я могу читать контент файла lí nea в lí nea с Bash? объясняет себе cГіmo обрабатывать файл lГ-nea в lГ-nea.

В твоем данном случае, tratarГ - чтобы делать:

while IFS='' read -r linea || [[ -n "$linea" ]]; do
    printf ">%s<\n" "$linea"
done < /etc/passwd

Однако, в твоем конкретном случае ты хочешь знать в quГ© lГ-nea estГЎ и, из-за этого, ты нуждаешься в счетчике. AdemГЎs, ты хочешь посмотреть пользователь, а следовательно ты можешь читать especГ-ficamente первую колонну показывая, что разделитель ":" с IFS=':' и read -r usuario resto. С этим, $usuario guardarГЎ эта стоимость:

contador=0
visto=0
while IFS=':' read -r usuario resto || [[ -n "$linea" ]]; do
    ((contador++))
    if [ "$usuario" = "$usuario_dado" ]; then
        printf "usuario %s en línea %d\n" "$usuario" "$contador"
        visto=1
        break
    fi
done < /etc/passwd

[ "$visto" -eq 0 ] && printf "no se ha encontrado\n"

В любом случае, с Awk serГ - в немедленный:

awk -F: -v usuario="$usuario_dado" '$1 == usuario_dado {print "línea", NR}' /etc/passwd

ВїPor quГ© ты не функционировал versiГіn? Итак, потому что estГЎs сравнивая с -eq, который для целых чисел:

$ us="hola"
$ [ "$us" -eq "hola" ] && echo "si"
-bash: [: hola: integer expression expected

Сравнения цепей делаются [ "$var1" = "$var2 ]:

$ [ "$us" = "hola" ] && echo "si"
si
2
ответ дан 20.11.2019, 04:58

У команды grep уже есть она opciГіn встречания nГєmero линии.

~$ grep -n root /etc/passwd 
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
36:satelliteroot:x:9003:9003::/home/satelliteroot:/bin/bash
~$ grep -n root /etc/passwd | awk -v FS=":" '{print $1}'
1
11
36

, Если было более одного совпадения podrГ-эксперт способствовать тому, чтобы он взял первую или Гєltima с head или tail

~$ grep -n root /etc/passwd | awk -v FS=":" '{print $1}' |head -1
1
~$ grep -n root /etc/passwd | awk -v FS=":" '{print $1}' |tail -1
36
0
ответ дан 20.11.2019, 04:58

Теги

Похожие вопросы