방금 bash
스크립트를 작성했는데 원하는 대로 작동합니다. 스크립트는 다음과 같습니다.
#!/usr/bin/env bash
DY=`date +%Y%m%d`
gunzip -c /var/log/cisco/cisco.log-$DY.gz > file.log
sleep 3
cat file.log | grep "Virtual device ath0 asks to queue packet" > file2.log
awk '{print $4}' file2.log > IP.log
sort IP.log | uniq > devices.log
wc -l devices.log
rm file.log file2.log IP.log devices.log
그러나 나는 이것에 익숙하지 않기 때문에 bash
그러한 스크립트를 실행하는 더 좋은 방법이 있는지 묻고 있습니다(여전히 bash
환경에 있음). 어떤 설명이라도 내 학습을 향상시키는 데 매우 유용할 것입니다.
답변1
- 주석이 달린 제목을 사용하여 스크립트의 기능과 사용 방법을 설명하세요.
/bin/sh
이식성을 위해 POSIX 쉘( )을 사용합니다 .bash
일반적으로 간단한 스크립트에는 필요하지 않습니다.- 하드코딩된 문자열 대신 변수를 사용하세요.
$(some_command)
역따옴표 대신 구문 사용을 고려하세요 .cat
입력 하지 말고grep
사용하십시오.grep <pattern> <file>
- 왜 자?
- 파일이 필요하지 않으면 임시 변수를 제거하고 대신 파이프를 사용하십시오.
sort | uniq
로 대체될 수 있다sort -u
- 임시 파일을 사용해야 하는 경우 다음을 고려하십시오.제대로 청소하세요.
답변2
다음은 "한 줄"로 된 스크립트의 변형입니다.
gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
grep "Virtual device ath0 asks to queue packet" | \
awk '{print $4}' | sort | uniq | wc -l
중간 임시 파일 생성을 방지합니다.가능한더 빠르게. 그러나 이러한 중간 파일이 필요하거나 사용하는 경우 한 줄은 더 나쁜 방향입니다.
잘 작성된 쉘 스크립트를 충분히 읽으면서 배운 한 가지는 "grep | awk" 시퀀스가 종종 결합될 수 있다는 것입니다. 스크립트의 경우 grep 명령이 대체되었습니다.
gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
awk '/Virtual device ath0 asks to queue packet/ { print $4 }' | \
sort | uniq | wc -l
답변3
최근에 유용하다고 생각했어요비공식 bash 엄격 모드:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
무엇보다도 이 매개변수 세트는 설정되지 않은 변수로 인한 놀라움을 줄이는 데 큰 도움이 됩니다.