Поиск имен пользователей в нескольких файлах и распечатка, если она не существует, используя скрипт bash - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть файл, который состоит из числа пользователей, и мне нужно сравнить его с несколькими файлами и распечатать, если какой-либо конкретный пользователь отсутствует в файлах с именем файла.

#!/bin/bash
awk '{print $1}' $1 | while read -r line; do
if ! grep -q "$line" *.txt;
then
echo "$line User doesn't exist"
fi
done

В приведенном выше сценарии , передавая файл user_list как $ 1 и может найти пользователей для одного целевого файла, но это не удается для нескольких файлов.

Содержимое файла:

user_list:
Johnny
Stella
Larry
Jack

One of the multiple files contents:
root:x:0:0:root:/root:/bin/bash
Stella:x:1:1:Admin:/bin:/bin/bash
Jack:x:2:2:admin:/sbin:/bin/bash

Использование:

./myscript user_list.txt

Желаемый вывод:

File1:
Stella doesn't exist
Jack doesn't exist

File2:
Larry doesn't exist
Johnny doesn't exist

Есть ли какие-либо предложения по достижению этого для нескольких файлов с печатью заголовков имен файлов?

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Используйте для l oop, чтобы перебрать каждый файл и выполнить код для каждого файла отдельно.

#!/bin/bash
for f in *.txt; do
    echo $f:
    awk '{print $1}' $1 | while read -r line; do
        if ! grep -q "$line" $f
        then
            echo "$line doesn't exist"
        fi
    done
    echo 
done
0 голосов
/ 16 апреля 2020

Это может делать то, что вы хотите.

#!/usr/bin/env bash

for f in *.txt; do           ##: Loop through the *.txt files
  for j; do                  ##: Loop through the argument files, file1 file2 file3
    printf '\n%s:\n' "$j"    ##: Print one of the multiple files.
    while read -r lines; do  ##: Read line-by-line & one-by-one all the *.txt files
      if ! grep -q "$lines" "$j"; then  ##: If grep did not found a match.
        printf "%s not doesn't exist.\n" "$lines" ##: Print the desired output.
      fi
    done  < "$f"
  done
done

Файлы *.txt должны находиться в текущем каталоге, в противном случае добавьте абсолютный путь, например, /path/to/files/*.txt

Howto use.

./myscript file1 file2 file3 ...
  • Недостатком является то, что вы запускаете grep line-by-line для каждого файла, в отличие от того, что делал @Quasimodo.
0 голосов
/ 16 апреля 2020

Вы можете сделать просто

for file in *.txt; do 
  echo "$file"
  grep -Fvf "$file" "$1"
  echo
done
...