
# 실습 디렉터리 생성
mkdir ~/text_practice
cd ~/text_practice
# 여러 파일 생성
cat > file1.txt << EOF
TODO: Fix the login bug
Error: Connection failed
error: Database timeout
This is a normal line
TODO: Update documentation
EOF
cat > file2.txt << EOF
Function: calculateTotal()
ERROR: Memory overflow
Success: Login completed
TODO: Add error handling
EOF
cat > config.conf << EOF
# This is a comment
ServerPort=8080
# Another comment
DatabaseURL=localhost
# End of config
EOF
TODO 주석 찾기grep -r "TODO" .).i), 줄 번호 출력(n), 매칭 안 되는 것 출력(v) 실습.| grep 파이프라인 연계 연습.가장 많이 씀. 현재 폴더 하위의 모든 파일에서 특정 문자열을 찾음.
Bash
grep -rni "함수이름" .

r (Recursive): 하위 폴더까지 싹 다 뒤짐.n (Line Number): 몇 번째 줄인지 알려줌.i (Ignore case): 대소문자 구분 안 함 (Error, error 다 찾음)..: 현재 위치에서 시작.특정 프로그램이 실행 중인지 확인할 때 사용.
Bash
ps -ef | grep "python" | grep -v "grep"
ps -ef: 모든 프로세스 출력.| (Pipe): 앞의 결과를 grep에게 넘김.grep -v "grep": 검색하고 있는 나 자신(grep 명령어)은 결과에서 뺌. (이게 꿀팁).pi@pi-222:~/project/text_practice $ ps -ef | grep "python" | grep -v "grep"
root 1331 1 0 Jan29 ? 00:00:00 python /usr/sbin/wayvnc-control.py
로그 파일에서 "Error"만 딱 보면 원인을 모름. 에러 발생 전후 5줄을 같이 뽑아봄.
Bash
grep -C 5 "Error" file1.txt
sudo grep -C 5 "error" /var/log/syslog
sudo grep -C 5 "Failed" /var/log/auth.log
C 5 (Context): 해당 단어 위아래 5줄씩 같이 출력.B 5 (Before): 위(이전) 5줄만.A 5 (After): 아래(이후) 5줄만.
conf 파일이나 소스 코드에서 주석(#)과 공백을 제거하고 진짜 설정값만 보고 싶을 때.
Bash
grep -v "^#" config.conf | grep -v "^$"


v (Invert): 해당 패턴을 제외하고 출력.^#: #으로 시작하는 줄 (주석).^$: 아무것도 없는 줄 (빈 줄).로그 파일 열어서 눈으로 세지 말고 숫자로 바로 확인.
Bash
grep -c "Failed" auth.log
grep -c "Error" file1.txt
grep -c "Error" file1.txt

c (Count): 검색된 줄의 개수만 출력.cat *.log | grep -c "Error" (모든 로그 합쳐서 에러 카운트).ls -l | awk '{print $9}'은 가장 흔하게 쓰이지만, 치명적인 약점(공백)이 있는 방법임.
awk는 기본적으로 "공백(Space)"을 기준으로 문장을 쪼개서 $1, $2, $3...에 담음.
ls -l의 결과는 보통 9개의 덩어리로 이루어져 있음.
rw-r--r-- 1 root root 4096 Jan 29 20:30 my_file.txt
[ $1 ] [$2] [$3] [$4] [$5] [$6] [$7] [$8] [ $9 ]
rw-r--r--)root)4096)my_file.txt)따라서 print $9를 하면 맨 뒤에 있는 파일 이름만 쏙 뽑혀 나옴.
파일 이름에 띄어쓰기가 있으면 망함.
Important Data.txt$9 : Important$10: Data.txtprint $9를 하면 "Important"만 출력되고 뒤는 잘림.$9부터 문장 끝($NF)까지 반복문을 돌려야 함.
Bash
ls -l | awk '{for(i=9; i<=NF; i++) printf $i " "; print ""}'
awk를 쓸 필요 없이, ls 자체 기능으로 이름만 출력하는 게 제일 빠르고 정확함.
Bash
ls -1

ls -l에서 두 번째 필드($2)는 "하드 링크(Hard Link)의 수"임.
쉽게 말해, "이 데이터(inode)를 가리키고 있는 이름표가 세상에 몇 개 붙어있나?"를 뜻하는 숫자.
ln 명령어(하드 링크)로 이 파일에 대한 "바로가기(복제본 아님)"를 하나 더 만든 상태.

/home/pi). (자기 자신을 가리키는 점).. (부모 가리킴) 때문).
디렉터리의 $2 숫자를 보면 "이 안에 서브 폴더가 대충 몇 개 있는지" ls 안 해보고도 알 수 있음.
링크 수 - 2 = 서브 폴더(자식 폴더) 개수원본 파일은 건드리지 않고, "바뀌면 어떻게 될지" 미리보기만 함.
Bash
sed 's/apple/orange/g' 파일명
i)확인 끝났으면 실제로 파일 내용을 변경해서 저장함.
Bash
sed -i 's/apple/orange/g' 파일명
i (in-place): 파일을 직접 수정하라는 핵심 옵션.s/old/new/g)s (Substitute): 치환 명령.g (Global): 한 줄에 apple이 여러 번 나오면 몽땅 바꿈.g를 빼면 맨 처음 나온 apple 하나만 바뀌고 뒤에 건 안 바뀜.\b 경계)그냥 apple로 바꾸면 pineapple이 pineorange가 되는 대참사가 발생함.
정확히 단어 apple만 바꾸려면 단어 경계(Boundary)를 지정해야 함.
Bash
sed -i 's/\bapple\b/orange/g' 파일명
\b: 단어의 시작과 끝을 의미. (pineapple 같은 포함 단어는 제외됨).