Obtendo entradas incompatíveis em 2 arquivos [closed]

0

Problema .. {Eu tenho usuários com diretórios home em / home, para que eu possa obter uma lista de usuários que correspondam aos meus critérios com o seguinte comando.

STEP 1: Fetching A List Of Users

du -h --max-depth=1 /home 2>/dev/null | egrep -v '(!G|.cp)' | awk -F"/" '{print $NF}'

Nota: O padrão grep estendido é minha exigência, pois os diretórios iniciais contêm arquivos extras que precisam ser invertidos de forma inversa. Além disso, o! G simboliza a necessidade de uma lista de usuários parciais com dados inferiores a 1G.

STEP 2: Fetching A List Of Suspended Users

ls -al /somedir/ | grep -v 'lock'

STEP 3: Need To Compare Those 2 Lists & Get Lines In File 1, that are not present in File 2

Então, estou preso nessa etapa, tentei o uniq & comando diff, mas eu não estou recebendo lista de usuários que atendam aos meus critérios.

PS: O comando que deve comparar os dois arquivos não deve comparar esses arquivos linha contra linha, mas sim no geral, portanto, qualquer linha que esteja no arquivo 1 & faltando no arquivo 2 deve ser a saída para mim.

    
por Sollosa 02.07.2018 / 12:57

4 respostas

1

Ok, eu pesquisei um pouco e a solução que eu estava procurando é esta

comm -23 <(sort File1) <(sort File2)
    
por 02.07.2018 / 16:09
1

Use parênteses para agrupar os dois comandos como um:

( du -h --max-depth=1 /home 2>/dev/null | egrep -v '(!G|.cp)' | awk -F"/" '{print $NF}' ; ls -al /somedir/ | grep -v 'lock' ; ) | sort | uniq

A saída dos dois comandos no parenthese é concatenada e aparece como a saída de um único processo (o subshell).

PS: Seu primeiro comando gera /home entre os diretórios ...

    
por 02.07.2018 / 14:03
1

Em vez de passar por dois arquivos gerados, faça uma iteração na lista mais longa de nomes de usuários e teste-os no outro diretório:

for userpath in /home/*/; do
    user=$( basename "$userpath" )
    if [ ! -e "/somedir/$user" ]; then
        printf 'User %s is not suspended\n' "$user"
    fi
done

Isso iteraria todos os subdiretórios em /home e testaria o nome de base de cada diretório (o nome de usuário) em relação aos nomes em /somedir . Se não houver um nome correspondente nesse outro diretório, o usuário não será suspenso.

    
por 02.07.2018 / 19:11
0

Se você deseja listar todas as linhas / palavras em um arquivo que não estão no outro:

grep -v -f {smallfile} {bigfile}
    
por 02.07.2018 / 18:09

Tags