다음 코드가 있습니다.
#!/bin/bash
FSTAB=` grep -vE "^#|swap|UUID" /etc/fstab | awk '{print $1,$2,$3}'`
for i in $FSTAB
do
echo "$i"
done
다음을 반환합니다.
/dev/mapper/centos-root
/
xfs
/dev/sdb2
/hdos
xfs
문제는 나중에 비교하고 싶어서 줄 바꿈을 사용하여 반환하고 점프하지 않고 한 줄로 반환하기를 원한다는 것입니다.
/dev/mapper/centos-root / xfs
/dev/sdb2 /hdos xfs
답변1
변수를 어떻게 채우든 상관없이 FSTAB
루프에서 따옴표가 없는 변수 확장은 for
다양한 유형의 공백 간의 구별을 제거합니다. (바라보다:언제 큰따옴표가 필요합니까?그리고공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?)
이 문제를 해결하려면 줄 바꿈으로만 분할하도록 설정하거나 IFS
루프를 사용하여 줄을 반복할 수 있습니다 while read
.
$ fstab=$(grep /etc/fstab ...)
$ while IFS= read -r line; do
printf "$line\n"
done <<< "$fstab"
while read -r dev mnt fs; do ...
이는 필드를 별도의 변수에 넣으려는 경우에도 작동합니다.
답변2
출력 을 다음으로 awk
파이핑하는 대신 :grep
awk
FSTAB=` grep -v "^#" /etc/fstab | grep . | grep -v "swap" | grep -v "UUID" | awk '{print $1,$2,$3}'`
로 변경될 수 있습니다
FSTAB="$(awk 'NF && $0 !~ /^#|swap|UUID/ {print $1, $2, $3}' /etc/fstab)"
개행 문자가 변수에 포함되므로 아무것도 반복할 필요가 없습니다 echo "$FSTAB"
.
그러나 /etc/fstab
변수로 구문 분석한 다음 구문 분석하는 대신저것/etc/fstab
awk
, 현재 스크랩 중인 출력에 필요한 작업을 정확하게 수행하는 더 복잡한 스크립트를 사용하여 직접 구문 분석하는 것이 더 나을 수 있습니다 .
답변3
오직암소 비슷한 일종의 영양 egrep
:
egrep -v "^#|swap|UUID" /etc/fstab | egrep -o '^(\S*\s*){1,3}'