서버를 설정하기 위해 bash 스크립트를 noatime
추가 하고 싶습니다 .fstab
/
파티션에 대해서만 안전한 방법으로 자동화하려면 어떻게 해야 합니까 ?
간단히 말해서:
해당 줄에 아직 bash/shell 코드를 사용하는 내용이 포함되어 있지 않은 경우 ,noatime
두 번째 문자열을 해당 줄의 네 번째 문자열에 추가하려면 어떻게 해야 합니까?/
noatime
예시 파일:
# Comment
UUID=1234567890-abcdef / ext4 defaults,discard 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
얻어야 할 것:
# Comment
UUID=1234567890-abcdef / ext4 defaults,discard,noatime 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
답변1
이렇게 하면 원하는 효과를 얻을 수 있습니다.
awk -i inplace '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab
이는 귀하가 요청한 것보다 조금 더 구체적입니다. 다음과 ,noatime
같은 경우 네 번째 필드에 추가됩니다.그 분야아직 포함되지 않음 noatime
, 전체 행을 확인하지 않습니다.
-i inplace
Gawk에만 해당됩니다. 지원되지 않는 경우 결과는 새 파일에 기록됩니다.
awk '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab > /etc/fstab.new && mv /etc/fstab{.new,}
두 경우 모두 서버 설정 스크립트가 루트로 실행되고 있다고 가정합니다.
(감사해요에드 모튼강력한 텍스트 교체를 위해 !를 사용할 때 네 번째 필드의 정규 표현식과 관련된 잠재적인 문제를 방지합니다 sub
. )
답변2
$ perl -p -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
# Comment
UUID=1234567890-abcdef / ext4 defaults,noatime,discard 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
정규식과 일치하는 줄 m:^[^#]+\s+/\s+:
(예: 공백으로 둘러싸인 /아니요앞에 #
주석이 있음) 및 일치하지 않으면 noatime
삽입되는 줄을 수정합니다 ,noatime
.
참고: 이는 ,noatime
뒷면 defaults
이 아닌 뒷면 에 삽입됩니다 discard
. 내 생각에는 이것이 defaults
거의 확실하게 존재하기 때문에( discard
어쨌든 그것보다 더 가능성이 높음) 더 의미가 있다고 생각합니다.
이는 연습 실행을 수행합니다. 즉, 수정하지 않고 ./fstab
표준 출력에 수행할 작업만 표시합니다. 실제로 파일을 수정하려면 Perl의 -i
옵션을 사용하십시오.
perl -p -i -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
물론 ./fstab을 /etc/fstab으로 변경합니다.
atime
그런데 , relatime
, 등의 기존 인스턴스 도 변경하려면 nodiratime
명령문을 추가하세요.첫 번째. 예를 들어
perl -p -e 'm:^[^#]+\s+/\s+: && /^[^#]+atime/ && s/([,\s])[^,\s]*atime/noatime/;
m:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
답변3
확장된 정규식 모드(-E)에서 실행되는 GNU sed를 사용하여 이 작업을 수행할 수 있습니다. 두 번째 필드가 단일 슬래시 "/"이고 네 번째 필드에 아직 전체 단어 "noatime"이 포함되어 있지 않은 줄을 확인한 다음 이를 네 번째 단어에 추가합니다.
sed -E -e '
\:^\s*\S+\s+/\s:!b
s/\S+/\n&\n/4
/\n(.*,)?noatime(,.*)?\n/!s/\n/,noatime/2
s/\n//g
' /etc/fstab