지난 시간 리뷰:
sudo -> 일회성 권한 부여
su -> exit 전까지 권한 부여
프로세스:
- 포그라운드
- 백그라운드 명령어 &
데몬 Daemon:
- systemd -> 프로세스가 관리하는 하위 백그라운드
- systemctl -> systemd를 관리하느 명령어
명령어:
- jobs, kill %\<jobid>
추가 학습
linux에 apache 설치 후 http 서버 접속
->
yum install -y httpd
systemctl status httpd
systemctl start httpd
tail -f /var/log/httpd/access_log
curl localhost
firewall-cmd --add-service http -> http 접속 허용을 위한 방화벽 설정 코드
12장. 텍스트 처리
리눅스에는 텍스트를 효과적으로 다룰 수 있는 명령어가 다수 존재.
wc 명령어 -> 입력 파일의 행 수, 단어 수, 바이트 수 출력 명령어. 옵션을 지정하지 않은 경우 차례대로 출력. -l, -w, -c 옵션 지정 시 각각에 해당하는 수만 출력.
sort 명령어 -> 행 단위로 정렬하여 결과 출력. 옵션 지정 없으면 알파벳순 정렬. ASCII 코드를 기준으로 정렬되기 때문에 알파벳 대문자가 알파벳 소문자보다 앞에 정렬됨.

ps 명령어 -> 특정 항목(프로세스 ID)를 기준으로 정렬
ps 명령어 결과를 COMMOAND 필드를 기준으로 정렬하고 싶은 경우:
$ ps x | sort -k 5
-> COMMAND는 5번째 필드이므로, -k 5로 지정.
sort 명령어 옵션 -> -n(숫자 값으로 정렬), -r(역순으로 정렬)
sort 명령어는 각 행을 문자열로 인식하기 때문에 앞글자 순서로 정렬됨. -> 숫자 기준 정렬이 필요하다면 -n 옵션으로 변경 필요.
-r -> sort 명령어는 알파벳 오름차순 정렬이 기본값.
uniq 명령어 -> 중복 제거. 연속된 중복 데이터를 하나만 출력. 즉, 연속되지 않은 중복 데이터는 제거하지 않으므로, sort 명령어로 정렬한 뒤에 uniq 명령어 실행 시 파일 전체의 중복 제거 가능.
필드 구분 -> 공백 또는 :
uniq -c -> 중복된 데이터의 개수 출력

cut 명령어 -> 입력의 일부를 추출하여 출력하는 명령어
$ cut -d <구분자> -f <필드 번호> [<파일 이름>]
-> -d로 구분자를 지정하지 않으면 tab을 기본으로 사용.
ex 1) $ cut -d : -f 7 /etc/passwd

ex 2) $ cut -d : -f 1,6,7 /etc/passwd | head -n 5

tr 명령어 -> 문자 치환 명령어.
$ tr <치환 전 문자> <치환 후 문자>

-> : 문자를 ' '(빈칸)으로 치환.
문자여러개 동시에 치환.
$ tr abc ABC
-> a,b,c를 각각 A,B,C로 변환.
범위 지정 가능.
$ tr a-z A-Z
-> 모든 소문자를 대문자로 변환.
tr 명령어는 문자 단위 치환 명령어이므로 문자열 단위로 치환하고 싶다면 sed나 awk 명령어 사용.
tr 명령어는 표준 입력만 받아들이도록 설계되었기 때문에 파일 지정 불가.

-> 파일 지정시 에러 발생.
텍스트 파일에 대해 tr 명령어 실행 -> cat 명령어의 결과를 파이프라인으로 전달 또는 입력 리다이렉션 필요.
ex)
tr -d \<삭제할 문자> -> 특정 문자 삭제. 개행문자 삭제 시 자주 사용.
tail 명령어 -> 파일의 마지막 부분 출력. 옵션 지정이 없으면 마지막 10행 출력. -n 옵션으로 출력할 행 수 지정 가능.
tail -f <파일 이름>
-> 파일 내용이 추가될 때 마다 내용을 출력하여 파일 모니터링 가능.

diff 명령어 -> 두 파일의 차이점 출력
$ diff [옵션] <비교 파일 1> <비교 파일 2>
소스 코드나 설정 파일의 편집 전 후 차이를 확인할 때 자주 사용.
변경 종류:
<범위 1>a<범위 2> -> 범위 1 뒤에 범위 2 내용 추가
<범위 1>c<범위 2> -> 범위 1 부분이 범위 2 내용으로 변경
<범위 1>d<범위 2> -> 버무이 1 부분이 삭제
-> 각 변경 범위를 헝크(hunk)라고 부름.
-u 옵션 -> 통일 포맷 사용 가능.
통일 포맷 예시:
@@으로 시작하는 행 -> @@-<첫 파일의 변경이 시작된 행>-<변경된 행 수>+<2번째 파일의 변경이 시작된 행>-<변경된 행 수>@@
ex) @@ -17,8 +17,6 @@
-> 첫번째 파일의 17번째 행부터 8행, 두번째 파일의 17번째 행부터 6행.
통일 포맷은 Git에서도 사용되므로 통일 포맷을 통해 차이를 파악하는 것에 익숙해지는 것이 중요.
GitOps -> Git을 통해 Operation 작업 수행. cloud native에서 자주 사용.
SCM -> Source Control Management
IaC ->
patch 명령어 -> diff 명령어로 얻은 변경된 사항 적용 가능.
13장. 정규 표현식
grep 명려어 -> 문자열 검색 명령어. <파일 이름>에서 <검색 패턴>에 일치하는 행 출력.
$ grep [옵션] <검색 패턴> <파일 이름>

-n 옵션 -> 행 번호 출력. 파일에서 검색한 문자열의 위치를 파악하기위해 사용.

-i 옵션-> 대소문자 구분 없이 검색. system 검색시 System도 검색됨.

-v 옵션 -> 검색할 문자열이 나타나지 않는 행 출력. log 파일이나 data 파일에서 불필요한 부분이 출력되지 않도록 할 때 주로 사용.

파이프라인으로 넘길 수도 있음.

grep 명령어 역시 다른 필터와 마찬가지로 파일을 지정하지 않으면 표준입력을 읽음. -> 다른 명령어의 실행 결과를 grep으로 검색하는 방식을 자주 사용

grep 명령어는 해당 문자열이 포함된 행의 전체를 출력.
일반적인 문자열 외에도 정규 표현식이라는 검색 패턴 지정 가능. -> 정규 표현식을 사용하면 조건에 일치하는 문자열 집합 표현 가능.

-> ^기호 사용시 cron으로 시작하는 문자열만 출력.
정규 표현식을 '(작은 따옴표)로 감싸지 않으면 셸에 의해 정규표현식이 확장될 수 있음.
-> ex) *는 셸에서 와일드카드로 해석되어 경로가 확장됨.
-> $ grep ab* sample.txt가 $ grepab.txt ab.sh sample.txt로 해석될 수 있음.
임의의 문자를 저장하는 메타문자:
.(점) -> 임의의 문자 하나를 의미. 문자 '.'은 알파벳과 숫자뿐만 아니라 기호도 포함하기 때문에 .org라는 정규 표현식으로 검색하면 borg와 .org가 모두 검색됨.

\. -> 점이 아니라 점이라는 기호 자체를 검색하고 싶을 때는 '(백슬레쉬)'를 붙여야됨.

-> 문자 앞에 '\'를 붙여서 메타 문자로 인식하는 것을 이스케이프(Escape string)라고 함.
[] -> 임의의 문자 하나가 아니라 여러 문자 중 하나를 지정 가능. 괄호 안에 있는 문자 중 하나를 의미 함.
[a-k] -> a부터 k까지를 지정.
[a-zA-Z] -> 알파벳 전체를 지정.
[^] -> []안에 포함되지 않은 문자

위치를 지정하는 메타 문자 -> 다른 메타문자와 조합하여 위치를 지정할 때 사용.
^(서컴플렉스) -> ^<단어> 인 경우, 해당 단어로 시작하는 문자열만 검색
$ -> 해당 단어로 끝나는 행 검색
^$ -> 시작이 곧 끝인 행. 즉, 빈 행을 의미하며 빈 행 출력처리에 사용.

반복을 지정하는 메타 문자 -> 다른 정규 표현식의 뒤에서 사용되어 직전의 정규 표현식이 일정 횟수만큼 반복되는 것을 의미함.
메타문자 * -> 0회 이상의 반복(= 직전의 문자가 나타나지 않는 것도 포함한다는 의미)

*는 일반 문자뿐만 아니라 메타 문자 뒤에도 사용 가능.

.* -> 임의의 문자가 0회 이상 반복됨을 의미 = 모든 문자열을 의미. ex) ^ex.*txt$ -> ex로 시작해 txt로 끝나는 행을 의미.
-E 옵션 -> 확장 정규 표현식. 옵션 지정이 없는 경우 해당 정규 표현식을 기본 정규 표현식으로 해석함.
\ -> 리눅스의 grep은 -E 옵션을 붙이지 않아도 메타 문자에 '\'를 붙여서 일부 확장 정규 표현식 사용 가능(잘 안씀).
? -> 0회 또는 1회를 의미. 공백에 이어 ?를 사용하는 경우 공백이 하나 있는 경우와 없는 경우 모두 검생.
{} -> 반복 횟수를 지정하는 메타 문자.
{m,n} -> m회 이상, n회 이하 반복을 의미.
{m} -> 정확히 m번 반복되는 패턴 의미.
{m,} -> m회 이상 반복을 의미.
그 외 메타 문자
() -> 정규 표현식을 그룹화할 때 사용. ex) (Wine){2,} -> Wine이라는 글자가 반복되는 패턴을 검색.
| -> 여러 정규 표현식을 OR 조건으로 연결할 때 사용. ex) My (Vodka|Wine) -> My Vodka 또는 My Wine이 검색됨.

정규 표현식 사용 -> Vim이나 less 명령어에서 /를 이용해 텍스트 검색 가능.
14장. 고도의 텍스트 처리(편집, 치환 ...)
sed 명령어 -> Stream Editor의 약자. 문자열을 치환할 때 많이 사용. 비대화형 에디터.
sed는 비대화형 에디터이므로 대화형 에디터인 window의 메모장이나 리눅스의 Vim과 동작 방식이 다름.
대화형 에디터 -> 파일 열기 -> 메모리상에서 편집 -> 편집한 파일에 정장
비대화형 에디터 -> 명령어 실행 -> 편집 실행 -> 완료된 내용 표준 출력으로 출력.
가장 큰 차이 -> 비대화형은 편집한 내용을 표준 출력으로 출력만 할 뿐 원래 파일의 내용을 바꾸는건 아님.
$ sed [옵션] <스크립트> <대상 파일>
d -> 행 삭제. n,md -> n행에서 m행까지의 행 삭제($는 마지막 행을 의미), 주소 지정이 없는 경우 모든 행 삭제.

주소에는 정규 표현식도 사용이 가능(정규표현식은 /로 감싸야함).

p -> 행 출력. sed는 한 행을 읽으면 패턴 스페이스라는 장소에 복사하고 편집 명령어를 실행한 뒤 패턴 스페이스의 내용을 출력함. 따라서
-n 과 함께 사용하면 특정 행만 출력 가능.

s -> 행 치환.
s/치환 전 문자열/치환 후 문자열/옵션

-> 옵션이 없는 경우 s 명령어는 각 행에서 처음 발견한 문자열만 치환함

-> 발견한 모든 문자열을 치환하려면 옵션 g 지정 필요.
치환전 문자열에 정규 표현식 지정 가능.

-> B로 시작하고 r로 끝나는 모든 문자열을 Whisky로 치환.
치환 후 문자열을 비운채 실행하면 해당 문자열 패턴을 지우는 것이 가능함.

-> !를 삭제
-r 옵션 -> sed에서 확장 정규 표현식 사용가능.
후방 참조 -> 정규 표현식을 사용해 치환할 때, 검색된 문자열의 일부를 치환하고 싶은 경우에는 후방 참조를 사용. 기본 정규 표현식과 확장 정규 표현식에 차이가 있음.
기본 정규 표현식의 후방 참조 -> () 로 그룹화, \1로 참조
확장 정규 표현식의 후방 참조 -> () 로 그룹화, \1로 참조

주소 지정 -> s명령어 사용시 주소를 지정을 통해 치환 범위 지정 가능.

-> 1~3행 사이의 Beer만 Whisky로 치환
구분자 변경 -> 치환할 문자열 안에서 /를 사용하려면 \/으로 입력하면 됨. 또는, s 뒤에 다른 문자를 지정하면 해당 문자가 구분자로 사용됨(! 또는 %가 많이 사용됨).

awk 명령어 -> 텍스트 검색, 추출, 가공과 같은 편집 작업을 위한 명령어. sed는 비대화형 에디터이고, awk는 더 고도의 기능을 제공항 텍스트 처리에 특화된 프로그래밍 언어임.
awk <스크립트> <대상 파일>
대상 파일을 지정하지 않으면 표준입력을 읽으며, 입력 테스트를 한 행씩 읽어서 지정한 처리를 수행. awk의 스크립트는 패턴과 액션으로 구성.
패턴 { 액션 }
</서식>
패턴 -> 액션 실행 여부를 결정하는 조건.
액션 -> 텍스트 추출, 치환, 삭제 등의 처리 지정. 패턴에 일치 할때만 액션이 실행됨. -> 패턴 생략시 모든 레코드에 대한 액션이 실행됨.
패턴 지정 ->
-F -> 프로그래밍 언어처럼 코드 사용 가능(?)
셸 스크립트 예시

https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=236050
ex 2)
#!/bin/sh
for name in $(cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 10000 {print $1}')
do
echo "사용자 $name 의 DISK 사용량은 아래와 같습니다. "
find / /usr /var /home /c4i/sgis/temp /c4i/data/exercise
-user $name -xdev -type f -ls | awk '{ sum += $7 } END { print sum / (1024*1024) "MB" }'done
exit 0
ex 문제) ps -ef로 보이는 출력 결과에서 프로세스를 실행한 CMD를 확인하시오. -> Kernel이 실행하는 프로세스는 제외해야 하므로 대괄호가 명령어는 생략하고 출력해야됨.
-> cut을 사용하는 경우에는 상당히 복잡함 -> awk 사용 필요
-> awk로 CMD 출력 + []가 감싸고 있는 명령어는 제외
ps -ef | awk '{print $8}' | grep -v '\[.*\]'