2개의 파일에서 일치하지 않는 항목 가져오기 [닫기]

2개의 파일에서 일치하지 않는 항목 가져오기 [닫기]

질문..{ 내 사용자의 홈 디렉터리는 /home에 있으므로 다음 명령을 사용하여 내 기준과 일치하는 사용자 목록을 가져올 수 있습니다.

1단계: 사용자 목록 가져오기

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

참고: 홈 디렉터리에 역방향 grep이 필요한 추가 파일이 포함되어 있기 때문에 확장 grep 모드가 필요합니다. G는 데이터가 1G 미만인 사용자의 부분 목록이 필요하다는 의미입니다.

2단계: 정지된 사용자 목록 가져오기

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

3단계: 파일 1의 목록 2개를 비교하고 파일 2에 존재하지 않는 줄을 가져와야 합니다.

그래서 이 시점에서 멈춰버렸습니다. uniq & diff 명령을 시도했지만 내 기준과 일치하는 사용자 목록을 얻지 못했습니다.

추신: 두 파일을 비교하는 명령은 이 파일을 한 줄씩 비교해서는 안 되며 전체적으로 비교해야 합니다. 따라서 파일 1의 모든 줄과 파일 2의 누락된 줄이 출력되어야 합니다.

답변1

글쎄요, 조금 조사해봤는데 제가 찾고 있는 해결책은 이것입니다

comm -23 <(sort File1) <(sort File2)

답변2

두 명령을 하나로 결합하려면 괄호를 사용하십시오.

( 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

괄호로 묶인 두 명령의 출력은 연결되어 하나의 프로세스(서브셸)의 출력으로 표시됩니다.

추신: 첫 번째 명령은 /home디렉터리에 출력됩니다...

답변3

생성된 두 파일을 반복하는 대신 더 긴 사용자 이름 목록을 반복하고 다른 디렉터리에 대해 테스트합니다.

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

이는 의 모든 하위 디렉터리를 반복하고 /home의 이름과 비교하여 각 디렉터리의 기본 이름(사용자 이름)을 테스트합니다 /somedir. 다른 디렉터리에 해당 이름이 없으면 사용자는 일시 중지되지 않습니다.

답변4

다른 파일에는 없는 한 파일의 모든 줄/단어를 나열하려면 다음을 수행하십시오.

grep -v -f {smallfile} {bigfile}

관련 정보