sed -i 를 백업 없이 운영 설정에 바로 쓴다패턴이 의도보다 넓게 걸리면 여러 줄이 한꺼번에 바뀌고, 원본이 없어 되돌릴 수 없습니다. ✅ 항상 -i.bak 으로 원본을 남기고, 먼저 -i 없이 화면으로 결과를 확인한 뒤 적용합니다.
sed 's/^server.port=.*/server.port=9090/' app.properties | diff app.properties - # 미리 보기
sed -i.bak 's/^server.port=.*/server.port=9090/' app.properties # 확인 후 적용grep 에 | 를 쓰고 -E 를 빼먹는다grep 'ERROR|WARN' 은 ERROR|WARN 이라는 글자 그대로를 찾아 아무것도 안 나옵니다. ✅ -E 를 붙이거나 egrep 을 씁니다. +, ?, {n} 도 같은 규칙입니다.
uniq -c 앞에 sort 를 빼먹는다uniq 는 바로 옆 줄끼리만 비교합니다. 흩어진 같은 값은 따로 세어져 결과가 틀립니다. ✅ sort | uniq -c 는 항상 짝으로 씁니다.
awk 에서 숫자를 문자열로 비교한다45ms 같은 값을 그대로 > 로 비교하면 사전순 비교가 되어 8 이 3001 보다 큽니다. ✅ $NF+0 처럼 +0 을 붙여 숫자로 바꿉니다. 단위 문자가 있어도 앞 숫자만 취합니다.
grep 결과를 cat 으로 먼저 읽는다cat app.log | grep ERROR 는 프로세스가 하나 더 뜨고 파이프 한 번을 더 거칩니다. ✅ grep ERROR app.log 로 파일을 직접 줍니다. 수 GB 로그에서는 속도 차이가 체감됩니다.
grep '$LEVEL' app.log 는 $LEVEL 글자 자체를 찾습니다. 작은따옴표 안에서는 변수가 펼쳐지지 않습니다. ✅ grep "$LEVEL" app.log 처럼 큰따옴표를 씁니다.
LEVEL=ERROR
grep '$LEVEL' app.log # 0줄, 글자 $LEVEL 을 찾음
grep "$LEVEL" app.log # ERROR 줄 출력grep 'app.log' 의 . 은 아무 글자 하나를 뜻해 appXlog 도 걸립니다. 반대로 IP 주소 10.0.0.1 을 찾을 때 10.0.0.1 이 10x0y0z1 도 잡습니다. ✅ 글자로서의 점은 \. 로 쓰거나 grep -F 로 고정 문자열 검색을 씁니다.
sed 치환에 / 가 든 값을 넣고 이스케이프를 놓친다sed 's//opt/old//opt/new/' 는 구분자가 뒤섞여 에러가 납니다. ✅ 구분자를 # 나 | 로 바꿉니다. sed 's#/opt/old#/opt/new#' 가 읽기도 쉽습니다.
tail -f | grep 이 아무것도 안 보인다고 판단한다파이프 뒤 grep 은 출력을 버퍼에 모으므로 화면이 한동안 비어 있습니다. 에러가 안 나는 게 아니라 아직 안 찍힌 것입니다. ✅ grep --line-buffered 를 붙이거나 awk 라면 fflush() 를 씁니다.
xargs 에 공백 있는 파일명을 넘긴다ls | xargs rm 은 my file.log 를 my 와 file.log 두 개로 쪼개 엉뚱한 파일을 지웁니다. ✅ find -print0 | xargs -0 짝을 쓰거나 find -exec 를 씁니다.
find . -name '*.log' -print0 | xargs -0 grep -c ERROR # 공백 안전
find . -name '*.log' -exec grep -c ERROR {} + # 같은 결과