때때로 아래 예와 같이 /etc/fstab 파일에 충돌이 있음을 알 수 있습니다.
/dev/sdg가 두 번 나타납니다!
/data/sdb가 두 번 나타납니다!
#
# /etc/fstab
# Created by anaconda on Wed Nov 9 13:26:03 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/vg00-OS-linux_root / xfs defaults
0 0
UUID=cc749f07-ad72-49e8-ab19-ec6532f5e9 /boot xfs
defaults 0 0
/dev/mapper/vg00-OS-linux_var /var xfs defaults
0 0
/dev/mapper/vg00-OS-linux_swap swap swap defaults
0 0
/dev/sdc /data/sdc ext4 defaults,noatime 0 0
/dev/sdb /data/sdb ext4 defaults,noatime 0 0
/dev/sde /data/sde ext4 defaults,noatime 0 0
/dev/sdf /data/sdf ext4 defaults,noatime 0 0
/dev/sdd /data/sdd ext4 defaults,noatime 0 0
/dev/sdg /data/sdb ext4 defaults,noatime 0 0
/dev/sdg /data/sdg ext4 defaults,noatime 0 0
/dev/sdh /data/sdh ext4 defaults,noatime 0 0
/dev/sdi /data/sdi ext4 defaults,noatime 0 0
/dev/sdj /data/sdj ext4 defaults,noatime 0 0
/dev/sdk /data/sdk ext4 defaults,noatime 0 0
/dev/sdl /data/sdl ext4 defaults,noatime 0 0
fstab 파일에서 첫 번째 필드 또는 두 번째 필드의 충돌을 찾기 위해 간단한 유효성 검사를 만들고 싶습니다.
이 목적에 가장 적합한 구문은 무엇입니까?
유효성 검사를 통해 첫 번째 필드나 두 번째 필드에서 중복된 단어를 찾아야 합니다(구문 라인최대한 짧아야 함)
예상 출력 -실패/정상
&(실패하면 첫 번째 필드/두 번째 필드의 모든 중복 단어가 인쇄되어야 함)
답변1
awk ' !/^#/ { if (seendev[$1]++) { print; ++rc; } if (seenmnt[$2]++) { print; ++rc; } }
END { exit rc }' < /etc/fstab
위의 awk one-liner는 열 1(장치) 또는 열 2(마운트 지점)와 중복되는 모든 행을 인쇄하고 위의 경우 0이 아닌 반환 코드로 종료됩니다.
답변2
#!/bin/sh
# Filter out comments and blank lines from /etc/fstab, pick 1st/2nd field,
# then sort and find duplicates.
DUP_DEVS="$(grep -v -e '^#' -e '^$' /etc/fstab | awk '{ print $1;}' | sort | uniq -d)"
DUP_MOUNTS="$(grep -v -e '^#' -e '^$' /etc/fstab | awk '{ print $2;}' | sort | uniq -d)"
if [ -z "$DUP_DEVS" ] && [ -z "$DUP_MOUNTS" ]; then
echo "ok"
exit 0
else
echo "fail"
if [ ! -z "$DUP_DEVS" ]; then
echo "Duplicate devices:"
echo "$DUP_DEVS"
else
echo "Duplicate mount points:"
echo "$DUP_MOUNTS"
fi
exit 1
fi
답변3
완벽한 솔루션awk
:
awk '/^\/dev\//{
if (devs[$1]++) dups[$1];
if (data[$2]++) dups[$2]
}
END{
res="Ok";
for (d in dups) { res="Fail\nDuplicates: "; break }
print "Result: "res;
for (d in dups) print d
}' /etc/fstab
산출:
Result: Fail
Duplicates:
/dev/sdg
/data/sdb