본문 바로가기
교육

[36일 차] 21.09.08 : Linux Server 15

by ballena 2021. 9. 8.

1교시

 

 

  • sed(stream editor) : 쉘 상에서 텍스트 처리를 위한 도구 중 하나. 나머지 하나는 awk.

프로그램 기능은 없고, 행 단위로 텍스트를 수정할 수 있는 도구. 프로그래밍적 기능이 들어간 도구는 awk.

 

비대화형 모드의 줄 단위 에디터. 표준 입력이나 파일로부터 텍스트를 입력받아 주어진 행 단위의 라인들에 대해 한 번에 한 라인씩 특정 처리를 한 다음, 그 결과를 표준 출력이나 리다이렉션해서 파일로 보낸다.

 

텍스트 파일에서 처리할 라인을 sed 임시 버퍼로 보내서 처리, sed 출력으로 처리한 라인을 출력

 

[주소범위]/p                     ->   [주어진 주소 범위]를 출력한다.

[주소범위]/d                     ->   [주어진 주소 범위]를 삭제한다.

s/패턴1/패턴2/                  ->   한 라인에서 처음 나타나는 패턴1을 패턴2로 치환한다.

s/패턴1/패턴2/g                ->   한 라인에서 나타나는 패턴1을 모두 패턴2로 치환한다.

[주소범위]s/패턴1/패턴2/     ->     주소 범위에 대해서 한 라인에 처음 나타나는 패턴1을 패턴2로 치환한다.

[주소범위]s/패턴1/패턴2/g    ->     주소 범위에 대해서 한 라인에 나타나는 패턴1을 모두 패턴2로 치환한다.

 

^ : 라인의 처음     ->     ^linux : linux로 시작하는 모든 라인

$ : 라인의 끝     ->     linux$ : linux로 끝나는 모든 라인

\{..\} : 매칭된 문자들 저장     

-> s/\{love\}able/\1er/     : 매칭된 패턴을 나중에 참조하기 위해 \1을 사용해서 1번 태그로 저장.

-> loveable은 lover로 치환하기 위한 문자열로 기억된다.

& : 치환 문자열로 기억될 수 있는 문자열을 저장

-> s/linux/**&**/   :   **linux**

-> &는 검색 문자열이므로 linux 문자열은 ** 문자로 둘러싸인다.

\< : 단어의 시작      ->      /\<linux/      : linux로 시작하는 단어를 포함하고 있는 라인을 매칭.

\> : 단어의 끝         ->      /linux\>/      : linux로 끝나는 단어를 포함하는 라인을 매칭

 

sed [옵션] [패턴] [파일]

-n : 결과물만 보인다(수정/삭제 시에는 빼야 한다).

-i : input. sed 버퍼에서 실행한 변경 사항을 파일에 적용한다.


2교시

 

 

  • awk

데이터를 조작하고 리포트를 생성하기 위해 사용하는 언어. 간단한 연산자를 명령 라인에서 사용할 수 있으며, 큰 프로그램을 위해 사용될 수 있다.

awk는 데이터를 조작할 수 있어서 쉘 스크립트에서 사용되는 필수 도구다. DB 관리를 위해서도 필수.

 

aws '/패턴/' 파일명

awk '액션' 파일명

awk '패턴{액션}' 파일명

 

  • action

- print함수 
아큐먼트로 변수와 계산된 값 또는 문자열 상수를 받는다. 문자열은 "" 로 둘러싸야함!
콤마(,)는 아큐먼트들을 분리하는 데 사용함. 만약 콤마를 사용하지 않으면 아큐먼트들은 서로 연결되어버린다.


- OFMT변수
숫자를 출력할때 숫자의 포맷을 제어할 때 사용.
%.6g

 

액션 쪽에 여러 가지 명령을 수행하려면 세미콜론으로 구분해 작성

 

 awk는 구분자를 통해 값을 분리하는데, 공백이나 탭을 기준으로 각 행의 데이터를 분리한다.

홍 길동   3324 -> 위치 변수 1에 홍, 2에 길동, 3에 3324

 

-f 옵션

awk액션과 명령이 파일에 작성되어 있다면 해당 내용을 불러올 때 사용.
awk명령을 특정한 파일에 저장해 두고 이 파일에 입력된 명령을 사용하여 다른 파일에 처리하고자 할 때 사용.

 

레코드와 필드

awk는 입력 데이터를 볼 수 없다. 포맷, 구조는 볼 수 있다.
기본적 레코드라 불리는 각 라인은 newline으로 분리된다.

더보기

레코드 분리자

기본으로 출력과 입력 레코드 분리자(라인 분리자)는 빌트인 awk 변수 ORS와 RS에 저장되는 반환 값이다.

ORS와 RS 값은 변경할 수 있지만 변경하지 않는 것이 좋다.

 

$0 변수
모든 레코드는 awk에서 $0로 참조된다.
($0는 수정될 수 있다.) 

NR 변수
각 레코드들의 번호는 awk의 빌트인 변수 NR에 저장된다.
레코드가 저장된 다음 NR의 값은 하나씩 증가한다.

필드(칼럼)
각 레코드는 디폴트로 공백이나 탭으로 분리된 필드라는 워드로 구성된다.
awk는 빌트인 변수인 NF에 필드의 개수를 유지한다.
NF의 값은 일반적으로 레코드당 100개의 필드를 가질 수 있다.

FS 변수
입력 필드 분리자(Field Separator)
디폴트 값으로 공백과 탭이 사용.
FS 변숫값은 BEGIN 문장 또는 명령 라인에서 새로운 값으로 변경될 수 있다.
명령 라인에서 FS변수의 값을 변경하기 위해서는 awk -F 옵션을 사용해야 함.

awk -F:   -> 필드 구분자가 : 가 된다.

기존 파일에서 구분자로 공백이 아닌 다른 문자를 사용할 때 유용.


3교시

 

 

awk 프로그래밍 - 패턴과 액션


패턴 ' '
액션 {}

  • awk와 정규표현식

^      문자열 시작과 매칭
$      문자열 끝과 매칭
.       문자 한 개와 매칭
*      문자가 없거나 그 이상과 매칭
+      하나의 문자 또는 그 이상과 매칭
-       문자가 없거나 하나와 매칭
[ABC]  A, B, C 문자셋 중 하나의 문자만 매칭
[^ABC] A,B,C 문자셋중 매칭 되는 문자가 하나도 없음
[A-Z]    A에서 Z까지의 범위에서 매칭되는 문자가 있음
A|B     A 또는 B문자와 매칭
(AB)+   AB 문자셋이 하나 이상 매칭 예) AB ABAB ABABABAB
\      특수기능 제거
&      검색 문자 역에서 검색된 문자열로 대체할 때 사용

 

  • 비교 표현식

비교 표현식은 어떤 상태가 참일 때만 액션이 수행되는 라인을 검색한다. 

이 표현식은 관계 연산자를 사용하고 숫자나 문자열을 비교할 때 사용.

< 보다 작다. x < y
<= 보다 작거나 같다 x <= y
== 같다 x == y
!= 같지 않다. x != y
>= 보다 크거나 같다 x >= y
> 보다 크다. x > y
~ 정규표현식과 매칭 된다 x ~ /y/
!~ 정규표현식과 매칭 되지 않는다. x !~ /y/

  • 조건 표현식

조건 표현식은 표현식을 검사하기 위해 물음표(?)와 콜론(:) 두 가지 심벌을 사용한다.
이 심벌은 if/else 문장이 하는 역할과 같은 결과를 의미함.

조건 표현식1 ? 표현식2 : 표현식3

{
if(표현식1)
표현식2
else
표현식3
}

 

  • 산술 연산자

+ 더하기 x + y
- 빼기 x - y
* 곱하기 x * y
/ 나누기 x / y
% 나머지연산 x % y
^ 멱수 x ^ y

 

  • 논리 연산자와 혼합 패턴

논리 연산자는 표현식 또는 패턴에서 참인지 거짓인지를 테스트함.


&&(논리 AND연산자) 연산자를 사용하면 두 개의 표현식 모두가 참일 때만 결과가 참이 된다.
||(논리 OR연산자) 연산자는 두 개의 표현식 중에 하나만 참이면 결과가 참이 된다.
혼합 패턴은 논리 연산자와 함께 패턴이 사용되는 표현식으로 이때 표현식은 왼쪽에서 오른쪽으로 평가된다.

&& 논리AND연산 a && b
|| 논리OR연산 a || b
! NOT연산 !a


4교시

 

 

  • awk 변수

awk 프로그램에는 변수가 존재하는데, 
변수의 값은 문자열이 될 수도 있고, 숫자가 될 수도 있고, 숫자와 문자를 결합한 값이 될 수도 있다.
변수를 설정하면 = 기호 우측 표현식의 타입이 된다.

1. 사용자 정의형 변수

= a=5 a=5
+= a+=5 a=a+5
-= a-=5 a=a-5
*= a*=5 a=a*5
/= a/=5 a=a/5
%= a%=5 a=a%5
^= a^=5 a=a^5

증가 연산자(++)와 감소 연산자(--)
변수에 1을 더하기 위하여 증가 연산자를 사용.
후위형 증가 연산자
x+=1 x=x+1 x++

x++ 표현식은 x=x+1

전위형 증가연산자
++x 표현식은 x에 먼저 1을 더하고 증감

변수에 1을 빼기 위하여 감소 연산자를 사용.

x-- 표현식은 x=x-1
--x 표현식은 x에 먼저 1을 빼고 감소

명령 라인에서의 사용자정의형 변수
변수는 명령라인에서 값을 할당받을 수 있으며, awk 스크립트에 전달된다.

2. 필드 변수
새 필드 할당에 의해 생성될 수 있으며, 필드 값이 참조되고 값을 가지지 않는다면 null문자열이 할당될 것이다
만약, 필드 값이 변경되면 $0 변수는 필드 분리자를 사용하여 재계산을 한다.

필드의 수는 일반으로 100까지로 제한되어 있다.

$3이 존재하지 않는다면 awk는 $3을 생성하고 100*$2/$1 연산의 결과를 3번 필드에 할당한다.
$3이 존재한다면 3번 필드에 할당한다.

awk '$4 == "한국" { $4 = "서울"; print}' filename

== 빌트인 내장 변수 == 
CONVFMT 숫자 포맷 변환
FILENAME 현재 입력 파일의 이름
FNR 현재 파일의 전체 레코드 수
FS 입력 필드 분리자
NF 현재 레코드에서의 전체 필드 수*
NR 레코드 수*
OFMT 숫자 출력 포맷

 

  • BEGIN 패턴

BEGIN 패턴은 awk가 입력 파일의 라인들을 처리하기 이전에 실행되며 액션 블록 앞에 놓인다.
BEGIN 블록은 awk가 BEGIN 액션 블록이 완료될 때까지 입력을 읽어 들이지 않기 때문에 입력 파일 없이 테스트할 수 있다.

'BEGIN{FS=":";OFS="\t\";ORS="\n\n"}

1. 빌트인 내장 변수들의 값을 변경하기 위해.
2. 사용자 정의형 변수들의 초기값을 할당하기 위해.
3. 출력의 한 부분으로서 헤더 또는 타이틀을 프린트하기 위해.

  • END패턴

어떤 입력 라인과도 매칭 되지 않는다. 하지만, END패턴과 연관된 액션들을 실행한다.

END 패턴은 입력의 모든 라인이 처리되고 난 후에 처리된다.

  • awk 리다이렉션

출력리다이렉션
awk에서의 결과를 리눅스 파일로 리다이렉션할 경우 쉘 리다이렉션 연산자를 사용한다.
단, 파일명은 큰따움표("")로 둘러싸야한다.
>  
>>

파일이 한 번이라도 오픈되면 명시적으로 닫히거나 awk 프로그램이 종료될 때까지 오픈된 상태를 유지하고, print문자의 출력은 리다이렉션 파일에 추가된다.

입력리다이렉션
>> getline 함수
getline 함수는 표준 입력, 파이프, 현재 처리되고 있는 파일로부터 입력을 읽기 위해 사용한다.
입력의 다음 라인을 가져와서 NF, NR, FNR 빌트인 변수를 설정한다. 
getline 함수는 레코드가 검색되면 1을 리턴하고, 파일의 끝이면 0을 리턴한다.
만약 에러가 발생하면 파일 오픈이 실패한 것으로서 getline 함수는 -1을 리턴한다.

awk 'BEGIN{ printf "What is your name?" ; getline name < "/dev/pts/0"} $1 ~ name { print "Found"name"on line", NR"."}END{print "Hi "name"."}' awkfile5

 

  • if / else if / else 조건문

-> 조건 표현식이 하나 이상이라면 세미콜론(;)또는 newline으로 조건 표현식을 분리할 수 있다.

 

if(조건표현식) {
   문장;문장;문장;....
}

 

  • loop 순환문
더보기

1. while

 

2. for 

 

3. break와 continue

break문장을 만나면 루프의 {}를 빠져나온다. 
continue 문장을 만나면 아래 문장을 스킵하고 루프의 초기로 돌아간 다음 반복 작업을 계속한다.

 

4. next

next 문장은 입력 파일로부터 입력의 다음 라인을 가져오고, awk 스크립트의 시작부터 다시 실행한다.

 

5. exit 함수
awk 문장을 종료하기 위해 사용한다.
단, 레코드 처리는 중단하지만 END 문은 스킵하지 않는다.
exit 함수는 아규먼트로 0에서 255 사이의 값을 가질 수 있으며, 인자 값에 따른 종료 상태를 가지게 된다.
배시쉘에서 종료상태를 알아볼 수는 있는 변수는 "?"이다.
이 종료상태 변수의 값이 0이면 정상종료.
이 종료상태 변수의 값이 1이면 비정상 종료.

exit 함수의 인자로 0(정상) 또는 1(비정상 종료)을 사용.

awk '{ exit(1) }' awkdata
echo $?


5교시

 

 

이제 약 2주 간 Ansible 진행.

베이그란트, VirtualBox(6.1.26 - 최신 버전)로 실습할 것.

 

플레이북이라는 파일의 형태로 구성 정보를 각 인프라에 뿌린다. 해당 인프라에서는 받은 파일로 지정된 패키지들을 설치. 앤서블은 시스템 구성을 관리할 수 있는 도구다.

 

* 멱등성 : 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질.

-> 에러가 발생하면, 역방향으로 설치했던 것들을 삭제하며 과정을 다시 시작한다.


6교시

 

 

아래에서 VirtualBox로 하는 환경은 "이렇게 할 수 있다" 정도만 알기 위해 하는 것.

실제 실습은 베이그란트 환경에서 진행할 것이다.

 

앤서블 실습 환경을 구축하려면 브리지 네트워크를 구축해야 한다. 호스트 PC가 공인 IP를 사용한다면 이 방식으로 못한다고 한다.

CentOS 7 x86_64 Minimal 2009 iso 다운로드

 

Linux > Redhat 64 bit, VDI

 

설정 > 네트워크 > 어댑터 1 > 다음에 연결됨 : 어댑터에 브리지, 로 변경 후 확인

저장소 > IDE 세컨더리 마스터 [광학 드라이브] 우클릭 > 새로 만들기 > 다운로드한 ISO 선택

상단의 파일 > 환경 설정 > 입력 > 하단의 자동으로 키보드 잡기 체크 해제, 가상 머신 탭에서 호스트 키 조합을 Ctrl + Alt로 변경

CentOS 7 설치는 VMWare에서 했던 대로 똑같이 진행(교재 2장)


7교시

 

 

6교시에서 했던 내용 계속. 교재 내용 그대로 따라가면 된다.

IP 주소와 기본 게이트웨이는 각자 설정에 맞게, DNS는 8.8.8.8로 설정

이런저런 테스트 해보고 이제 구축한 VM을 복제 > Ansible-node01 ~ 03, 모든 네트워크 어댑터의 새 MAC 주소 생성

> 완전한 복제 > 완료 > 새로 만든 각 VM의 IP 설정

 

Ansible-Server에서

yum -y install epel-release

yum -y install ansible

 

자주 쓰게 될 명령어(/usr/bin/ 에 있다)

ansible-config

ansible-galaxy

ansible-inventory

ansible-playbook

 

/etc/ansible/hosts 맨 하단에 노드들의 주소 추가

ansible all -m ping > yes 3번 입력

ansible all -m ping -k > Ansible 연결 확인

 

SSH 연결이 먼저 일어난 후 통신 가능

 

 

환경 설정 파일은 /etc/ansible/ansible.cfg

[defaults] : 기본 설정 부분

   inventory : 관리할 노드들의 정보 -> /etc/ansible/hosts

   library : 모듈 정보 -> /usr/share/my_modules/

   sudo_user : 원격 접속 시 사용하는 계정


8교시

 

 

자주 사용되는 옵션

-i (--inventory-file) : 적용될 노드들 선택

-m (--module-name) : 사용하는 모듈

-k (--ask-pass) : 암호를 물어보도록 설정(안쓰면 에러 발생)

--list-hosts : 적용되는 노드들을 확인

 

ansible 자체 명령어는 잘 쓰지 않는다. 복잡한 명령을 날리기 어렵다.

단일 명령을 날릴 때나 쓰는데, 구성 파일을 만들어서 날릴 목적이라면 ansible-playbook 명령어 사용.


오늘은 교재 p. 63까지 진행.

교시별로 정리하기 시작한 이후로는 집중력이 떨어지는 일 없이 잘 듣고 있다.

댓글