
짧은 질문: 파일에서 단일 번호 변수를 업데이트하는 가장 효율적인 방법은 무엇입니까?
긴 질문: 저는 다양한 이유로 어떤 호스트가 Linux 방화벽에 추가되었는지 기록하는 보안 프로그램(fail2ban)의 출력을 보고 있습니다. Fail2ban을 사용하면 위반자가 감지될 때 사용자 지정 작업을 수행할 수 있으며[1] 파일에서 변수를 간단히 증가시킬 계획이었습니다. 이 파일은 나중에 파일에 액세스하는 다른 서버에서 아직 알려지지 않은 시간 간격으로 숫자를 표시하는 데 사용됩니다.
awk/gawk를 사용하여 파일을 로드하고, 변수를 가져오고, 변수를 추가한 다음 해당 위치에 저장할 계획입니다.
VPS에서 과도한 디스크 쓰기 및 CPU 사용량을 절약하기 위해 가장 효율적인 방법은 무엇입니까? Fail2ban에 무언가를 등록할 때 파일에서 임의의 숫자를 가져와서 증가시킨 후 가장 효율적인 방법으로 작성하십시오. 동일한 파일을 반환할 수 있는 가능한 방법 (디스크 IO, 메모리 사용량 또는 CPU 사용량).
[1] - Fail2Ban은 명령줄 인수를 추가할 수 있는 다음 작업을 제공합니다. 여기에 효율적인 스니펫을 추가하고 싶습니다.
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = awk...
actionunban = awk..
*디블로킹을 똑같이 효율적인 방식으로 실행할 수 있고 그 반대의 경우에도 보너스 포인트(수량 감소)
답변1
파일의 숫자를 증가시키는 매우 빠른 방법은 다음과 같습니다.
awk -F, '{$0=$0+1}1' OFS=, failtoban.txt >tmp; mv tmp failtoban.txt
할 수 있는 일을 줄이려면:
awk -F, '{$0=$0-1}1' OFS=, failtoban.txt >tmp; mv tmp failtoban.txt
그러나 동시에 너무 빠르게 증가하거나 감소하는 것은 고려되지 않습니다.
실제로 몇 가지 작은 변경을 수행한 후 해당 위치에서 파일을 수정할 수 있습니다.
증가:
awk -i inplace '{ print $0=$0+1 }' failtoban.txt
점점:
awk -i inplace '{ print $0=$0-1 }' failtoban.txt
Ed Morton의 의견에 따르면 이 모든 것이 더 현명하게 수행될 수 있습니다.
증가:
awk -F, '{++$0}1' OFS=, failtoban.txt >tmp; mv tmp failtoban.txt
점점:
awk -F, '{--$0}1' OFS=, failtoban.txt >tmp; mv tmp failtoban.txt
증가:
awk -i inplace '{ print ++$0 }' failtoban.txt
점점:
awk -i inplace '{ print --$0 }' failtoban.txt