AWK & SED 예제

System/Common 2012. 4. 5. 23:48

 

  • Awk?

- 자료 처리리포트 생성에 사용하는 프로그래밍 언어

- 사용자가 지정한 패턴 검색이나 특별한 작업을 수행하기 위해 파일을 행 단위로 조사

     

<Form>

# awk '패턴' [파일명]

# awk '{액션}' [파일명] -->액션으로 보통 print를 사용한다.

# awk '패턴 {액션}' [파일명]

     

     

예제1> passfile 의 내용은 아래와 같다. awk를 사용하여 첫 번째 필드를 출력하라.

# awk '{print $1}' passfile -> 동작으로 print를 할것이고 $1은 첫번째 필드를 의미.(필드는 공백으로 구분된다.)

     

     

     

예제 2> passfile에서 Access를 포함하는 행들의 첫 번째와 두 번째 필드를 출력하라.

# awk '/Access/{print $1, $2}' passfile --> / / 사이에 검색할 문자 or 패턴이 들어가며 액션으로 첫 번째 두 번째 필드

출력하도록 하였다.

     

     

예제 3> # df명령을 통해 출력되는 내용 중 두번째 필드가 9920624 이상인 행을 출력하라.

# df | awk '$2 >= 9920624' --> df의 프로세스를 awk로 넘겨주고, awk는 두번째 두번째 필드를

9920624와 비교하여 크거나 같은 행을 뽑는다. ( ' ' 안에는 패턴이 들어가게 된다.)

     

     

예제 4> # date 실행에 나오는 두 번째 필드와 여섯 번째 필드에 Month : 와 Year : 라는 문자를 추가해 뽑아내라.

# date | awk '{print "Month : "$2, "\nYear : "$6}' --> 액션으로 print를 쓰게되면 " "를 통해 문자로 출력이 가능하다.

때문에 "Mont : "다음에 두번째 필드가 출력된 것.

     

     

     

  • awk 명령에 사용되는 NR , NF 변수 와 옵션

   

* NR 변수 - 하나의 레코드를 처리한 후 1이 증가하는 변수. (즉, 해당 패턴이 몇 번째 행에 있는지 나타내 주는 변수)

* NF 변수 - 필드의 개수를 출력하는 변수

* -F 옵션 - 공백문자를 필드 구분자로 사용하지 않고 필드 구분자를 무엇으로 사용할지 지정하는 옵션.

* ~ ! - ~는 특정 레코드나 필드내에서 일치하는 정규 표현식 패턴이 존재하는지 검사.

ex) # awk '$1 ~ /[aA]pple/' [파일명] --> 해당 파일의 첫번째 필드apple or Apple이 일치하는 것을 뽑아냄.

! 는 not이다. 반대되는 개념. 즉, 패턴과 일치하지 않는 것을 뽑아낸다.

ex) # awk '$1 !~ /[aA]pple/' [파일명] --> 해당 파일의 첫번째 필드에 apple or Apple와 일치하지 않는 것을..

예제 1> NR 변수를 사용하여 해당 awk 에 의해 몇 개의 레코드가 검색되었는지 맨 앞과 맨 뒤에 나타내라.

# awk '{print NR, $1, $2}' passfile

# awk '{print $1, $2, NR}' passfile -> {print 뒤를 순서대로 출력할 것이다. 즉, NR은 { }안의 어느 위치 든 쓸 수 있다.

     

     

예제 2> NF 변수를 사용하여 검색된 해당 레코드에 몇 개의 필드가 있는지 나타내라.

# awk '{print NF, $1, $3}' passfile --> 첫 번째와 3번째 필드만 출력하되 NF는 해당 레코드에 몇 개의 필드가 있는지 표시.

   

     

예제 3> -F옵션을 사용하여 : 를 구분자로 사용 하여 첫번째 필드와 세 번째 필드를 출력하라.

# awk -F : '{print $1, $3}' passwd --> -F [구분자] 를 :로 지정해 줬기 때문에 :를 기준으로 필드를 인식한다.

결과를 보면 :를 기준으로 첫번째와 세번째 필드가 출력됨을 알 수 있다.

     

     

예제 4> Tab으로 필드를 구분하여 첫번째와 세번째 필드를 출력하라.

# awk -F '[\t]' '{print $1, $3}' passfile --> Tab은 [\t] 이렇게 인식시킨다. ' '(싱글쿼터)로 묶어준 이유는 대괄호를

인식하는 것을 방지하기 위함이다.

   

그 외 예제>

     

* ":"구분자를 기준으로 필드를 나누며 root를 포함하는 행을 출력

# awk -F : '/root/{print $0}' [파일명] -->> 패턴으로 root문자열을 검색하여 print $0 즉, 해당 패턴이 있는 모든 필드를 출력.

     

* n이나 s로 시작하는 행의 첫 번째 필드를 출력

# awk '/^[ns]/{print $1}' [파일명]

     

* 네 번째 필드가 jun 으로 끝나면 문자열 NAME : 과 두번째 필드 및 마침표를 함께 출력

# awk '$4 ~ /jun$/{print "NAME :" $2"."}' [파일명]

     

     

LAB)

- /etc/passwd 파일에서 bash 쉘을 사용하는 유저의 계정명과 홈 디렉토리를 다음과 같은 형식으로 출력하시오

     

EX) USER : [계정명] HOME : [홈디렉토리]

     

# awk -F : '/bash${print "USER : ["$1"]", "\t\tHOME : ["$6"]"}' /etc/passwd

     

     

     

  • Sed

- sed는 대화형 기능이 없는 편집기이다. 기본적으로 모든 행을 출력한다.

- 한 번에 한 행씩 처리하며, 결과를 화면으로 내보낸다. (리 다이렉션 > 을 통해 저장도 가능)

     

FORM

# sed '명령어' [파일명]

     

option

-n

해당 패턴 or 실행 결과만을 출력 (기본적으로 출력되는 모든 행을 막는다.)

-e

다중 편집을 가능하게 해준다.

     

sed 명령어 FORM(' '안에서 쓰인다.)

p

print 명령 사용자가 지정한 행을 출력
ex) '1,3p' -> 1행부터 3행까지 출력

d

delete명령 사용자가 지정한 행을 삭제

ex) '3d' -> 3번째 행을 삭제

r

read명령 사용자가 지정한 행을 읽어온다
ex) '3r phone' [패턴검색파일] --> 패턴검색할 파일의 3번째 행에 phone의 내용을 읽어와 출력.

w

write명령 사용자가 지정한 행에 쓴다.
ex) '/패턴/w [쓰여질파일]' [패턴검색파일] --> 패턴에 일치하는 행을 검색하여 [쓰여질 파일]에 쓴다.

a\

append명령 검색된 패턴 아래 행에 내용을 덧붙인다.
ex) '/패턴/a\내용' [파일명] --> 패턴에 일치하는 행의 다음에 내용을 삽입하여 출력.

i\

insert명령 검색된 패턴 위에 내용을 덧붙인다. a\와 사용법은 동일.

     

     

예제 >

sed를 사용한 phone파일의 1행에서 3행까지 출력

- # sed '1,3p' phone -->> 1행에서 3행까지 p(print) 하겠다는 의미인데,

sed는 기본적으로 모든 행을 출력하고 매칭되는 패턴을 또 출력하게 된다..

- #sed -n '1,3p' phone --> 그래서 해당 패턴의 결과만을 출력하게 해주는 -n옵션을 사용했다.

     

     

  • r(read)명령어 쓰기 FORM

# sed '/패턴/r [읽어올파일]' [패턴검색파일]

     

sed를 사용하여 aaa의 b패턴이 일치하는 행의 아래에 phone의 내용 출력

- # sed '/b/r phone' aaa --> aaa에서 b패턴을 검색하여 일치하는 행의 아래에 phone의 내용 출력

     

출처 : http://blog.naver.com/passioncode

'System > Common' 카테고리의 다른 글

HP LoadRunner  (0) 2012.04.24
로케일(Locale)이란  (0) 2012.04.19
PATH 환경변수 우선순위  (0) 2012.04.05
ssh와 sftp 사용 권한 설정  (0) 2012.04.04
/bin/false VS /sbin/nologin  (0) 2012.04.04
Posted by linuxism
,

my.cnf 설정

DB/MySQL 2012. 4. 5. 15:49


Be sure to know your my.cnf [sections]

The MySQL configuration file, e.g. /etc/my.cnf has a number of different section headings including [mysql], [mysqld], [mysqld_safe]. It is important that you ensure you put the right variables into the right section. For example, the following my.cnf configuration file will not operate as the user probably expects.

[mysqld]
...
log-bin=mysql-bin
server-id=1
query_cache_size = 100M
query_cache_type = 1

...

[mysqld_safe]
...
key_buffer_size=600M
skip-innodb
...

In this example, this configuration does not give you a MyISAM key buffer of 600M, it’s actually the default of 8M.

mysql> show global variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name   | Value   |
+-----------------+---------+
| key_buffer_size | 8388600 |
+-----------------+---------+

Be sure to add the right options to the [mysqld] section.

What I didn’t know until yesterday was that some programs read from multiple groups. From the 5.1.2. Server Command Options MySQL reference manual page. In helping the describe the problem for the benefit of readers I actually learned something new myself.


mysqld reads options from the [mysqld] and [server] groups. mysqld_safe reads options from the [mysqld], [server], [mysqld_safe], and [safe_mysqld] groups. mysql.server reads options from the [mysqld] and [mysql.server] groups.

I have for example always put log-error in both the [mysqld_safe] and [mysql]d sections because both of these write different errors. Seems that is unnecessary.



source - http://ronaldbradford.com/blog/be-sure-to-know-your-my-cnf-sections-2010-01-26/






my.cnf

MySQL의 설정은 '/etc/my.cnf'(Ubuntu v11.10 MySQL v5.1의 경우 /etc/mysql/my.cnf)을 이용한다.

'my.cnf'는 UNIX/Linux 계열의 MySQL 엔진에서 사용하는 Configuration File이다. 이 파일은 설치 시 또는 MySQL 구동 시 지정하여 사용할 수 있다.

# mysqld_safe --default-file=/etc/my.cnf --user=mysql &



my.cnf 설정 변수

 datadir

 Database File을 생성할 Directory를 설정

 autocommit

 [0] disable   [1] Set

 socket

 사용할 Socket File

 port

 TCP/IP 접속 시 사용할 PORT

 binlog_cache_size

 Transaction 실행동안 Binary Log를 저장하기 위한 Cache Size 

 innodb_file_per_table

 테이블마다 테이블 스페이스를 두겠다는 의미

 innodb_log_files_in_group

 InnoDB 로그 파일 개수 정의(default=2). 가능한 변경하지 않는 것을 권장

 innodb_buffer_pool_size

 System Memory의 50~80% 사이로 정의

 innodb_log_file_size

 트랜잭션을 기록하는 로그 파일의 크기를 결정하는 옵션.

 로그파일은 무한정 계속 커지는 것이 아니라 일정한 크기와 갯

 수를 가지고 순환식으로 처리되므로 innodb_log_file_size는 

 inno_buffer_pool_size 의 15% 정도로 설정.

 만약 메모리가 1기가이면 inno_buffer_pool_size = 512M 이고, 

 innodb_log_file_size = 80M.

 innodb_log_buffer_size

 로그 파일을 기록하기 위한 버퍼 사이즈.

 트랜잭션이 작거나 거의 없다면 크게 잡는것은 낭비.

 보통 1M~8M 사이로 설정.

 innodb_additional_mem_pool_size

 Dictionary Cache Size 정의. 8~16M 설정.

 'Show innodb status'에 나타나면 증가 권장

 innodb_flush_log_at_trx_commit

 INSERT, UPDATE 등 데이터 삽입과 관계된 설정 값.

 Commit 을 하였을때, 그 즉시 Commit 된 데이터를 log file 에 

 기록할지 안할지를 설정.

 로그파일을 기록할 경우 갑작스러운 경우 데이터 손실을 막을 

 수 있지만, 매번 로그를 기록하므로 속도가 저하.

 [1] Commit 즉시 반영  [0] 추후 반영

 innodb_autoextend_increment

 Tablespace가 확장될 때 증가되는 Size(MB) (default=8M)

 innodb_thread_concurrency

 Thread수 * Disk수 (default=8)



 

 

 

 



참조 링크

http://blog.naver.com/entrv/100017025105

http://mysqldba.tistory.com/26

http://cafe.naver.com/swingme/236



MySQL 문자 Set 정의 관련 설정 변수


[client]

default-character-set=utf8


[mysqld]

character-set-client-handshake=FALSE

default-character-set=utf8

character-set-server=utf8

collation-server=utf8_general_ci

init-connect='set names utf8'


[mysqldump]

default-character-set=utf8


[mysql]

default-character-set=utf8



InnoDB 관련 설정 변수
[mysqld]
innodb_data_home_dir="/MySQL/MySQL Server 5.0/ibdata/"
innodb_log_group_home_dir="/MySQL/MySQL Server 5.0/iblogs"
innodb_data_file_path=ibdata1:10M:autoextend:max:1000M
innodb_additional_mem_pool_size=3469K
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=2M
innodb_buffer_pool_size=256M
innodb_log_file_size=40M
innodb_thread_concurrency=8
innodb_log_archive=0

출처 - http://aladdin07.blog.me/150122882385








* sample in fedora20(mariadb) 

  - default-character-set=utf8 부분을 [mysqld] 섹션에 넣으면 에러 발생

# cat /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

# Settings user and group are ignored when systemd is used.

# If you need to run mysqld under a different user or group,

# customize your systemd unit file for mysqld/mariadb according to the

# instructions in http://fedoraproject.org/wiki/Systemd


# Currently, there are mariadb and community-mysql packages in Fedora.

# This particular config file is included in respective RPMs of both of them,

# so the following settings are general and will be also used by both of them.

# Otherwise the RPMs would be in conflict.

# Settings for particular implementations like MariaDB are then

# defined in appropriate sections; for MariaDB server in [mariadb] section in

# /etc/my.cnf.d/server.cnf (part of mariadb-server).

# It doesn't matter that we set these settings only for [mysqld] here,

# because they will be read and used in mysqld_safe as well.

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid


init_connect="SET character_set_server=utf8"

init_connect="SET collation_connection=utf8_general_ci"

init_connect=SET NAMES utf8

character-set-server=utf8

collation-server=utf8_general_ci

skip-character-set-client-handshake


[mysqld_safe]

#

# include all files from the config directory

#

!includedir /etc/my.cnf.d


[client]

default-character-set=utf8


[mysql]

default-character-set=utf8


[mysqldump]

default-character-set=utf8



* sample in centos6(mariadb)

# vi /etc/my.cnf

#

# This group is read both both by the client and the server

# use it for options that affect everything

#

[client-server]


#

# include all files from the config directory

#

!includedir /etc/my.cnf.d


[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0


init_connect=SET character_set_server=utf8

init_connect=SET collation_connection=utf8_general_ci

init_connect=SET NAMES utf8

character-set-server=utf8

collation-server=utf8_general_ci


[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid


[client]

default-character-set=utf8


[mysql]

default-character-set=utf8


[mysqldump]

default-character-set=utf8








Q.

I am trying to understand the different sections inside the my.ini configuration file ([client], [mysqld], [mysql]) and so on, I am looking for a guide describing each of the optional sections for the my.ini file, Also i was wondering what is the difference between init_connect and init-connect and i mean between the underscore(_) and the hyphen(-), Thank you all and have a nice day.


A.

[mysql] applies to the mysql command line client - [mysql and client options]

[client] applies to all connecting clients (including mysql cli) - [mysql and client options]

[mysqld] applies to the mysql server - [server options]

[mysqldump] applies to the utility of the same name - [mysqldump options]

...etc

The difference between the (-) and the (_) is the context in which it is used.

(-) is used in command line parameters, where (_) is used in options file parameters.

You can see more in the docs: http://dev.mysql.com/doc/refman/5.5/en/option-files.html



source - http://stackoverflow.com/questions/15453555/mysql-configuration-file-sections






'DB > MySQL' 카테고리의 다른 글

MySQL 로그 파일 관리 2 - 로그 파일 남기기  (0) 2012.05.02
mysql 외래키 옵션  (0) 2012.04.06
character_set_server 설정  (0) 2012.04.05
MySQL 로그 파일 관리 1  (0) 2012.04.04
mysql 트리거 사용하기  (2) 2012.04.02
Posted by linuxism
,


1. 확인
 - mysql> status
 - characterset 확인

2. 수정
 - /etc/my.cnf
 - 각각 내용에 맞게 수정

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
# 인코딩이 제대로 설정이 안될경우 아래로 대체함
#collation-server=utf8_unicode_ci

init_connect=SET collation_connection=utf8_general_ci
init_connect=SET NAMES utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


3. 테이블 인코딩 확인
 - mysql> show table status

4. 테이블 인코딩 변경
 - mysql> ALTER TABLE 테이블명 CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

출처 : http://gayafoundation.blogspot.com/2011/03/mysql-unicode-incorrect-string-value.html,http://woolab.net/140121564550, http://blog.daum.net/iamwhoi/5740155



===================================================================================


수동 실행 시 옵션

#./bin/mysqld_safe --datadir=/usr/local/mysql/data --character-set-server=utf8 &



정상 동작 my.cnf 예제

[mysqld]

init_connect=SET character_set_server=utf8

init_connect=SET collation_connection=utf8_general_ci

init_connect=SET NAMES utf8

character-set-server=utf8

collation-server=utf8_general_ci


[client]

default-character-set=utf8


[mysql]

default-character-set=utf8


[mysqldump]

default-character-set=utf8













'DB > MySQL' 카테고리의 다른 글

mysql 외래키 옵션  (0) 2012.04.06
my.cnf 설정  (0) 2012.04.05
MySQL 로그 파일 관리 1  (0) 2012.04.04
mysql 트리거 사용하기  (2) 2012.04.02
MySQL DATE 포맷 및 함수  (0) 2012.04.02
Posted by linuxism
,