티스토리 툴바

  블로그   태그   위치로그   이웃로그   방명록
          
 
 
 
 
     
 
  programming 에 해당되는 글 8
2012/03/19   MySQL Query Monitoring 
2012/03/16   iptables를 이용한 Proxy 서버 구축 
2012/03/16   iptables를 이용한 Port Forwarding 
2011/07/22   방화벽 포트의 오픈 여부 확인 
2009/05/13   ORA-08177 - can't serialize access for this transaction 
2008/07/30   [Linux] grep & find 계열 명령어 
2008/07/07   vi 사용 Tip 
2008/07/02   VIM 명령어 
  MySQL Query Monitoring  +   [programming]   |  2012/03/19 17:34
MySQL에서 실행되는 Query 정보를 확인하는 방법 아래와 같이 몇가지 있습니다.

1. show processlist

MySQL Console 내에서 위의 명령어를 통해서 현재 실행 중인 (또는 연결된) Process 정보를 확인 할 수 있습니다.


DB Connection Full이나 hang 걸린 query를 찾아낼 때 유용합니다.

2. General Query Log

 MySQL에서는 실행된 Query 정보를 Log File로 남길 수 있는데
MySQL 5.0 까지는 mysqld 데몬 실행 시 Log File을 설정해 주어야 합니다.

[mysql@localhost ~]# mysqld --log=/var/log/mysql.log

 
하지만 실행 중인 mysqld 데몬을 재실행해야 하는 부담이 있기 때문에

MySQL 5.1 이상부터는 runtime 상황에서 Query Log를 설정 할 수 있게 추가되었습니다.

mysql> show VARIABLES where variable_name like 'general_log%';

+------------------+-------------------------------+

| Variable_name     | Value                                      |

+------------------+-------------------------------+

| general_log          | OFF                                        | 

| general_log_file     | /APP/mysql-data/localhost.log | 

+------------------+-------------------------------+

2 rows in set (0.00 sec)


mysql> set GLOBAL general_log = 'ON';

Query OK, 0 rows affected (0.01 sec)


mysql> show VARIABLES where variable_name like 'general_log%';

+------------------+-------------------------------+

| Variable_name     | Value                                      |

+------------------+-------------------------------+

| general_log          | ON                                         | 

| general_log_file    | /APP/mysql-data/localhost.log | 

+------------------+-------------------------------+

2 rows in set (0.00 sec)


mysql> set GLOBAL general_log = 'OFF';

Query OK, 0 rows affected (0.05 sec)

 
위와 같이 general_log = 'ON' 으로 설정하면 general_log_file 로 설정된 파일 위치에 실행 Query 정보가 쌓이게 되므로

해당 파일을 tailing 하면 Query 모니터링이 가능합니다. 

(general_log = 'OFF' 설정을 하기 전까지는 로그 파일이 계속 쌓이게 되므로 Disk Full을 유의해야 합니다.)

3. tcpdump

 MySQL 데몬이 binding하고 있는 Port(기본 3306)를 tcpdump를 통해 Packet Capturing을 하는 방법입니다.

[mysql@localhost ~]# tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings

 
위와 같은 명령어를 사용하면 eth0 인터페이스로 들어오는 3306 포트의 tcp Packet의 문자열들을 보여줍니다.

하지만 이렇게 하면 실행 쿼리 및 기타 정보까지 모두 보이기 때문에
perl을 이용하여 깔끔하게 Query 명령어만 보여주도록 아래와 같이 shell을 만들도록 합니다.

[mysql@localhost ~]# vim query_monitor.sh

#!/bin/sh

#

# MySQL 패킷 살펴보기

#


INTERFACE="eth0"

PORT="3306"



tcpdump -i $INTERFACE -s 0 -l -w - dst port $PORT | strings | perl -e '

while(<>) { chomp; next if /^[^ ]+[ ]*$/;

  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {

    if (defined $q) { print "$q\n"; }

    $q=$_;

  } else {

    $_ =~ s/^[ \t]+//; $q.=" $_";

  }

}' 

 
 tcpdump를 이용해 캡쳐된 Packet들 중에서 Query 구문만 골라서 보여주는 Shell 입니다.

 위의 shell을 이용하면 eth0 인터페이스로 들어오는 3306 포트 패킷에서 SELECT, UPDATE, DELETE, INSERT, SET, COMMIT, ROLLBACK, CREATE, DROP, ALTER 구문이 들어가는 string을 모니터링 할 수 있습니다.

 
 
TAG Linux, mysql, tcpdump
TRACKBACK 0    COMMENT 0
  iptables를 이용한 Proxy 서버 구축  +   [programming]   |  2012/03/16 16:56
이번에는 iptables를 이용해서 간단한 Proxy 서버를 만들어 보겠습니다.

기본 컨셉은 아래와 같습니다.

 
보통의 3 Tier 시스템은 2차 방화벽 뒤에 DBMS가 위치합니다.

운영시에는 문제가 없지만,
개발 환경에서는 Local PC에서 DBMS에 접속하여 테스트 하거나
운영 환경 Data를 필요로 할 때 등에는 접근 자체가 불가능하여
Local System에 복사본 System을 구축하여 매번 Mirgration을 해야하는 상황이 발생하게 됩니다.

이럴 때 iptables를 이용하여 패킷을 외부 Server로 Forwarding 해주는 Proxy 서버를 구성할 수 있습니다.

아래와 같이  iptables를 이용해 설정해 줍니다.

[root@localhost ~]# sysctl net.ipv4.ip_forward=1

net.ipv4.ip_forward = 1

[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.10:3306

[root@localhost ~]# iptables -t nat -A POSTROUTING -j MASQUERADE


 IpV4에 대해서 Forward가 가능하게 설정하고
80 포트로 들어오는 tcp 패킷 들을 192.168.0.10 서버의 3306 포트로 넘겨줍니다.
또한 192.168.0.10 서버에서 오는 해당 응답을 다시 돌려줘야 하기 때문에 POSTROUTING도 설정해 줍니다.

위와 같이 설정한 다음 iptables 상태를 보면 아래와 같습니다.

[root@localhost ~]# service iptables status

Table: nat

Chain PREROUTING (policy ACCEPT)

num  target     prot opt source               destination         

1    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 to:192.168.0.10:3306 

 

Chain POSTROUTING (policy ACCEPT)

num  target     prot opt source               destination         

1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           

 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination         

 

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination


 이제 Proxy Server의 80 포트로 접속하면 MySQL DB 서버의 3306번 서버로 접속되는 것을 확인할 수 있습니다.
 
TAG iptables, Linux
TRACKBACK 0    COMMENT 0
  iptables를 이용한 Port Forwarding  +   [programming]   |  2012/03/16 11:59

Linux에서는 보안상의 이유로 1024 번 이하의 Port는 root 유저만 사용이 가능합니다.

보통 WEB/WAS 실행 시 80 또는 443 port를 binding하기  위해
아예 root 계정으로 올리거나 sudo 등의 명령어를 통해 실행하는데

user 계정으로 실행하면서 
Port Forwarding을 이용하여
8080 또는 8443으로 Binding 된 서비스를 80 또는 443 포트로 접속하는 방법을 알아보겠습니다.


Concept은 아래와 같습니다.

 
WEB/WAS를 8080 포트로 Binding하고 방화벽은 80 Port만 열어두어서

사용자가 불필요하게 http://siteUrl:8080 형태로 접속하지 않아도 되며

root 계정이 아닌 user 계정으로 서버를 실행하여 보안 이슈를 회피하고 Port 가용성을 확보하는 방법입니다.

일단 현 상황을 알아보기 위해서 iptables 이 어떤 상태인지 확인 합니다.

[root@localhost ~]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination   


 
위에서는 아무 정책도 설정되지 않은 것이 보입니다. 

아래와 같이 두 개의 작업을 추가해 줍니다.

[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
[root@localhost ~]# iptables -t filter -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT 


80 포트를 8080 포트로 REDIRECT 하고 80포트에 대한 FORWARD를 허락하는 명령입니다.

 다시 iptables 상태를 확인해 보면 아래와 같이 변경됨을 알 수 있습니다.

[root@localhost ~]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination         


Table: nat

Chain PREROUTING (policy ACCEPT)

num  target     prot opt source               destination         

1    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8080 


Chain POSTROUTING (policy ACCEPT)

num  target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination

 
이제 80 포트를 통해 서버로 접속하면

8080 포트로 Binding 된 서비스로 Forwarding 됨을 확인 할 수 있습니다.

 
 
TAG iptables, Linux
TRACKBACK 0    COMMENT 0
  방화벽 포트의 오픈 여부 확인  +   [programming]   |  2011/07/22 14:56

근래의 모든 IT System들은 방화벽 내부에서 보호받고 있습니다. 이러한 시스템들은 대부분 특정 포트만 접속을 허용함으로써 외부로 부터 오는 불특정 다수의 공격에 대해 원천적으로 접근을 금지 합니다.

하지만 반대로 특정 포트에 대한 방화벽 해제를 요청한 후에 실제로 해당 포트가 해제 되었는지에 대해서는 확인하기가 참으로 난감합니다. 물론 해당 포트로 제공되는 서비스를 실행해서 확인하면 되겠지만 실 구현물이 없는 상태에서는 속수무책일 수 밖에 없습니다.

이런 가려움을 긁어주는 툴이 역시나 MS에서 제공하고 있습니다.

바로 PortQry 라는 툴입니다.

PortQry는 Windows Command Line 상에서 특정 IP또는 Domain의 포트가 어떤 상태인지 확인 가능합니다.

자세한 사용법은 이곳을 참조하면 되고

간단하게

portqry -n 192.168.1.20 -e 1434 -p tcp


형태로 실행합니다.

PortQry 실행 후 조회한 포트 별로 3가지 상태가 나오는데 상세한 의미는 아래와 같습니다.

포트 상태 보고

PortQry는 다음 방법 중 하나로 포트의 상태를 보고합니다.
  • LISTENING(수신 중) 이 응답은 대상 포트에서 프로세스가 수신 대기 중임을 나타냅니다. PortQry가 대상 포트에서 응답을 받았습니다.
  • NOT LISTENING(수신 중이지 않음) 이 응답은 대상 포트에서 수신 대기 중인 프로세스가 없음을 나타냅니다. PortQry가 대상 포트에서 다음 ICMP(Internet Control Message Protocol) 메시지 중 하나를 받았습니다.
    Destination unreachable
    Port unreachable
  • FILTERED(필터링됨) 이 응답은 대상 포트가 필터링되고 있음을 나타냅니다. PortQry가 대상 포트에서 응답을 받지 못했습니다. 프로세스가 대상 포트에서 수신 대기 중이거나 그렇지 않을 수 있습니다. 기본적으로 PortQry는 TCP 포트를 세 번 쿼리하고 FILTERED 응답을 반환하며 UDP 포트를 한 번 쿼리하고 FILTERED 응답을 반환합니다.



위 상태들 중 FILTERED 상태일 때는 아직 방화벽 해제가 되지 않은 상태로 보면 됩니다.

PortQry를 손쉽게 사용하기 위한 GUI 도구로 PortQryUI도 제공합니다.

 
 
TAG PortQry, 방화벽, 포트
TRACKBACK 0    COMMENT 0
  ORA-08177 - can't serialize access for this transaction  +   [programming/Spring-Batch]   |  2009/05/13 19:36

배치잡의 특성상 동일시점에 여러개의 Job이 실행 될 수 있다.

DB를 Oracle을 사용한다면 위와 같은 상황에서 종종 발생하는 것이

ORA-08177 - can't serialize access for this transaction

이 에러이다.

JOB_EXECUTION 등의 테이블을 대상으로 동시에 update와 select 등이 발생하기 때문에 발생하는 문제이다.

이는 Programming적인 문제이기 보다는 ORACLE 설정에 대한 문제이다.

http://forum.springsource.org/showthread.php?t=61948&highlight=ORA-08177

위 링크와 함께

org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean의

소스를 살펴보면

    public abstract class AbstractJobRepositoryFactoryBean implements FactoryBean, InitializingBean {
    private PlatformTransactionManager transactionManager;
    private ProxyFactory proxyFactory;
    private String isolationLevelForCreate = DEFAULT_ISOLATION_LEVEL;
    /**
     * Default value for isolation level in create* method.
     */
    private static final String DEFAULT_ISOLATION_LEVEL = "ISOLATION_SERIALIZABLE";
    ......

Spring Batch의 isolationLevelForCreate 기본값은 ISOLATION_SERIALIZABLE 임을 알 수 있다.

이값을 jobRepository 빈의 설정에서 변경해 줌으로써 해결 할 수 있다

<bean id="jobRepository"
  class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
  p:dataSource-ref="batch.dataSource" p:transactionManager-ref="transactionManager" 
  p:isolationLevelForCreate="ISOLATION_DEFAULT"/>

위와같이  Isolation Level을 Default로 바꾸어 주면 ORA-08177 에러는 더 이상 볼 수 없게 된다.

 
TAG Spring Batch
TRACKBACK 0    COMMENT 0
  [Linux] grep & find 계열 명령어  +   [programming]   |  2008/07/30 11:01
1.grep 명령어

1.1 grep의 의미
grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.
fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다.
즉, 정규표현식의 메타문자도 일반 문자로 취급한다.

1.2 grep의 동작 방법
grep에서 사용하는 정규표현식 메타문자

메타문자
기    능
사용 예
사용 예 설명
^
행의 시작 지시자
'^love'
love로 시작하는 모든 행과 대응
$
행의 끝 지시자
'love$'
love로 끝나는 모든 행과 대응
.
하나의 문자와 대응
'l..e'
l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응
*
선행문자와 같은 문자의 0개 혹은 임의개수와 대응
' *love'
0개 혹은 임의 개수의 공백 문자 후에 love로 끝나는 문자열을 포함한 행과 대응
[]
[] 사이의 문자 집합중 하나와 대응
'[Ll]ove'
love나 Love를 포함하는 행과 대응
[^ ]
문자집합에 속하지 않는 한 문자와 대응
'[^A-K]love'
A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응
\<
단어의 시작 지시자
'\
love로 시작하는 단어를 포함하는 행과 대응(vi,grep에서 지원)
\>
단어의 끝 지시자
'love\>'
love로 끝나는 단어를 포함하는 행과 대응
(vi,grep에서 지원)
\(..\)
다음 사용을 위해 태그를 붙인다.
'\(lov\)ing'
지정된 부분을 태크1에 저장한다. 나중에 태그값을 참고하려면 \1을 쓴다. 맨 왼쪽부터 시작해 태그를 9개가지 쓸 수 있다. 왼쪽 예에서는 lov가 레지스터1에 저장되고 나중에 \1로 참고할 수 있다.
x\{m\}
문자 x를 m번 반복한다.
'o\{5\}'
문자 o가 5회 연속적으로 나오는 모든 행과 대응
x\{m,\}
적어도 m번 반복한다.
'o\{5,\}'
문자 o가 최소한 5회 반복되는 모든 행과 대응
x\{m,n\}
m회 이상 n회 이하 반복한다.
o\{5,10\}'
문자 o가 5회에서 10회 사이의 횟수로 연속적으로 나타나는 문자열과 대응

grep의 옵션

옵션
동작 설명
-b
검색 결과의 각 행 앞에 검색된 위치의 블록 번호를 표시한다. 검색 내용이 디스크의 어디쯤 있는지 위치를 알아내는데 유용하다.
-c
검색 결과를 출력하는 대신, 찾아낸 행의 총수를 출력한다.  (count)
-h
파일 이름을 출력하지 않는다.
-i
대소문자를 구분 하지 않는다.(대문자와 소문자를 동일하게 취급). (ignore)
-l
패턴이 존재하는 파일의 이름만 출력한다.(개행문자로 구분) (list file)
-n
파일 내에서 행 번호를 함께 출력한다. (number)
-s
에러 메시지 외에는 출력하지 않는다. 종료상태를 검사할 때 유용하게 쓸 수 있다.
-v
패턴이 존재하지 않는 행만 출력한다. (invert)
-w
패턴 표현식을 하나의 단어로 취급하여 검색한다. (word)
 
# grep -n '^jack:' /etc/passwd
(/etc/passwd 파일에서 jack을 찾는다. jack이 행의 맨 앞에 있으면 행 번호를 화면으로 출력한다.)

1.3 grep과 종료 상태
grep은 파일 검색의 성공 여부를 종료 상태값으로 되돌려준다.
패턴을 찾으면 0, 패턴을 찾을 수 없으면 1, 팡리이 존재하지 않을 경우 2
sed,a자 등은 검색의 성공 여부에 대한 종료 상태값을 반환하지 않는다. 다만 구문 에러가 있을 경우에만 에러를 보고한다.

2. 정규표현식을 사용하는 grep의 예제
# grep NW datafile
# grep NW d*
(d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.)
# grep '^n' datafile
(n으로 시작하는 모든 행을 출력한다.)
# grep '4$' datafile
(4로 끝나는 모든 행을 출력한다.)
# grep TB Savage datafile
(TB만 인자이고 Savage와 datafile은 파일 이름이다.)
# grep 'TB Savage' datafile
(TB Savage를 포함하는 모든 행을 출력한다.)
# grep '5\.' datafile
(숫자 5, 마침표, 임의의 한 문자가 순서대로 나타나는 문자열이 포함된 행을 출력한다.)
# grep '\.5' datafile
(.5가 나오는 모든 행을 출력한다.)
# grep '^[we]' datafile
(w나 e로 시작하는 모든 행을 출력한다.)
# grep '[^0-9]' datafile
(숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다.)
# grep '[A-Z][A-Z] [A-Z]' datafile
(대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)
# grep 'ss* ' datafile
(s가 한 번 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다.)
# grep '[a-z]\{9\}' datafile
(소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다.)
# grep '\(3\)\.[0-9].*\1 *\1' datafile
(숫자 3,마침표,임의의 한 숫자,임의 개수의 문자,숫자 3(태그),임의 개수의 탭 문자,숫자 3의 순서를 갖는 문자열이 포한된 모든 행을 출력한다.)
# grep '\
(north로 시작하는 단어가 포함된 모든 행을 출력한다.)
# grep '\' datafile
(north라는 단어가 포함된 모든 행을 출력한다.)
# grep '\<[a-z].*n\>' datafile
(소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다. 여기서 .*는 공백을 포함한 임의의 문자들을 의미한다.)

3. grep에 옵션 사용
# grep -n '^south' datafile
(행번호를 함께 출력한다.)
# grep -i 'pat' datafile
(대소문자를 구별하지 않게 한다.)
# grep -v 'Suan Chin' datafile
(문자열 Suan Chin이 포함되지 않은 모든 행을 출력하게 한다. 이 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.
# grep -v 'Suan Chin' datafile > black
# mv black datafile
)
# grep -l 'SE' *
(패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다.)
# grep -w 'north' datafile
(패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.)
# grep -i "$LOGNAME" datafile
(환경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다. 작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)

4. egrep
egrep(extended grep) : grep에서 제공하지 않는 확장된 정규표현식 메타문자를 지원  한다.
                                     grep와 동일한 명령행 옵션을 지원한다.
egrep에서 지원하는 확장 메타문자
메타문자
기능
사용 예
사용 예 설명
+
선행문자와 같은 문자의 1개 혹은 임의 개수와 대응
'[a-z]+ove'
1개 이상의 소문자 뒤에 ove가 붙어있는 문자열과 대응. move,approve,love,behoove 등이 해당된다.
?
선행문자와 같은 문자의0개 혹은 1개와 대응
'lo?ve'
l 다음에 0개의 문자 혹은 하나의 문자가 o가 나오는 문자열과 대응. love,lve 등이 해당된다.
a|b
a 혹은 b와 대응
'love|hate'
love 혹은 hate와 대응.
()
정규표현식을 묶어준다
'love(able|ly)'
lovable 혹은 lovely와 대응.
'(ov)+'
ov가 한 번 이상 등장하는 문자열과 일치.

4.1 egrep 예제
# egrep 'NW|EA' datafile
(NW나 EA가 포함된 행을 출력한다.)
# egrep '3+' datafile
(숫자 3이 한 번 이상 등장하는 행을 출력한다.)
# egrep '2\.?[0-9]' datafile
(숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
# egrep ' (no)+' datafile
(패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
# egrep 'S(h|u)' datafile
(문자 S 다음에 h나 u가 나오는 행을 출력한다.)
# egrep 'Sh|u' datafile
(패턴 Sh나 u를 포함한 행을 출력한다.)

 

5. 고정 grep 과 빠른 grep
fgrep : grep 명령어와 동일하게 동작한다. 다만 정규표현식 메타문자들을 특별하게 취급하지
          않는다.
# fgrep '[A-Z]****[0-9]..$5.00' file
([A-Z]****[0-9]..$5.00 이 포함된 행을 출력한다. 모든 문자들을 문자 자체로만 취급한다.)
 
6. find 명령어
find 명령의 일반적인 형태는 다음과 같다.
         find path expressions
각각의 인수들의 의미는 다음과 같다.
path
찾기 시작할 위치를 나타낸다. 예를들어, `.'은 현재 디렉토리를 나타내고, `/'은 루트 디렉토리부터 찾을 겻을 나타낸다.
expression
특정 파일을 찾기 위한 여려가지 조건들을 표현하는 부분으로 option, test, action, operator 등의 구문으로 구성되어진다.

그럼, expression의 각각의 구성 요소에 대하여 알아보자. optiontest와 상관 없이 항상 적용된다. option의 방법에는 다음과 같은 것이 있다.

-name : 확장자가 txt 인 화일을 찾는다.

          find / -name '*.txt'       

-perm : 퍼미션이 666(-rw-rw-rw-)인 화일을 찾는다.

          find . -perm 666       

-type : 파일의 타입을 지정하여, 찾고자하는 파일을 찾는다.

타입의 종류는 다음과 같다.
b : 블록 특수 파일(block device)
c : 캐릭터 특수 파일 (character deice)
d : 디렉토리(directory)
f : 일반파일(file)
l : 심볼릭 링크(link)
p : 파이프 (pipe)
s : 소켓 (socket)

현재 디렉토리 아래에 있는 서브디렉토리를 모두 찾는다.

          find . -type d       

-atime +n/-n/n : 최근 n일 이전에 액세스된 파일을 찾아준다.(accessed time)
+n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 액세스되었음을 의미한다.

시스템 전체에서 한 달 또는 그 이상의 기간동안 한번도 액세스하지 않은 디렉토리

          find / -atime +30 -type d       

-ctime +n/-n/n : ctime은 파일의 퍼미션을 마지막으로 변경시킨 날짜를 의미한다. (changed time)
+n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 수정되었음을 의미한다.

현재 디렉토리 아래에서 최근 일주일 동안 고친 파일

          find . -ctime -7        

-mtime +n/-n/n : mtime은 파일내의 data를 마지막으로 변경한 날짜를 의미한다.(modified time)
+n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 수정되었음을 의미한다.
-cnewer 파일명 : '파일명' 부분에 적어준 파일보다 더 최근에 수정된 파일들을 찾아준다.

test.txt 화일이 생성된 이후의 화일을 찾는다.

          find . -cnewer test.txt -print         

-user 유저네임 : '유저네임' 부분에 지정한 유저 소유의 파일을 찾아준다.

nalabi 라는 계정의 화일을 찾아준다.

          find / -user nalabi


그외 자주 쓰이지 않지만 추가 옵션으로는 아래와 같다.

-maxdepth n
0이 아닌 정수값으로 경로 깊이를 지정하여 검색을 할 경우에 사용한다. 예를들어, '
-maxdepth 1'은 시작위치로 지정한 디렉토리만 검색하고 하위 디렉토리는 찾지 않는다.

-mindepth 옵션은 반대로 동작한다. 즉, 지정한 숫자만큼의 깊이부터 그 하위 디렉토리를 검색한다. (GNU find 버전)

-follow

심볼릭 링크된 디렉토리도 검색을 할 경우에 사용한다.

-mount
현재의 파일 시스템과 동일한 타입의 파일 시스템에서만 검색을 할 경우에 사용한다.
test에는 다음과 같은 방법들이 있으며, test에 사용하는 인수에는 보다 큰 수를 의미하는 `'나, 보다 작은 수를 의미하는 `'를 함께 사용할 수 있다. 인수에 아무 연산자가 없을 경우에는 정확히 그 인수 값을 의미한다.

-group
특정 그룹 소유의 파일들을 찾을 경우에 사용한다.

-nouser
소유자가 없는 파일을 찾을 경우에 사용한다. 즉, /etc/passwd 파일에 없는 소유자의 파일을 찾을 경우에 사용한다.

-nogroup
올바른 그룹의 소유가 아닌 파일을 찾을 경우에 사용한다. 즉, /etc/groups 파일에 없는 그룹의 소유인 파일을 찾을 경우에 사용한다.

newer file1 file2
`file1' 보다는 이후에 `file2' 보다는 이전에 생성되거나 변형된 파일들을 찾을 경우에 사용한다.

-size n[bckw]
크기가 n 유닛(unit)인 파일을 찾을 경우에 사용한다. 유닛은 기본 설정(`b''와 함께 사용한 경우와 동일)인 512 바이트의 블럭, `c'를 사용할 경우에는 1 바이트, `k'를 사용할 경우에는 킬로바이트, `w'를 사용할 경우에는 2 바이트의 워드 크기를 나타낸다.

-empty
비어있는 파일이나 디렉토리를 찾을 경우에 사용한다. (GNU find 버전)

-regex
정규표현식(regular expression)을 이용하여 파일들을 찾을 경우에 사용한다. `-iregex'는 대소문자를 구별하지 않을 경우에 사용한다. (GNU find 버전)
actiontest에서의 조건과 일치하는 파일들에 대해 수행할 작업을 명시하는 것으로 다음과 같은 방법들이 있다.

-print
찾은 파일들을 표준출력(stdout)으로 출력한다. 기본으로 설정되어 있다.

-fprint file
찾은 파일들을 `file'로 출력한다. `file'이 존재 하지 않을 경우에는 새로 생성되고, 존재할 경우에는 기존의 파일은 없어진다. (GNU find 버전)

-exec
파일을 찾았을 경우, 찾은 파일들에 대해 특정 명령을 수행 할 때 사용한다. 일반적으로 `-exec command {} ;'의 형식을 취한다.

-ok
-exec와 동일한 작업을 한다. 다른 점은, 명령을 실행할 때마다 실행 의사를 물어본다.

-ls
`
ls -dils' 형식으로 찾은 파일들의 정보를 출력할때 사용한다.

-fls file
`ls'와 동일하게 동작하며 결과를 `file'로 출력한다.
operatortest에서 사용한 옵션들을 조합하여 조건식을 만들고자 할때 사용는 것으로 다음과 같은 방법들이 있다. (설명 순서는 우선순위(precedence)에 따른다.)

[예제]
자신의 홈 디렉토리에서 확장자가 '.txt'인 파일을 찾을 경우
$ find   -name "*.txt'' -print

현재 디렉토리 밑에서 첫글자가 영어 대문자인 모든 파일을 찾을 경우
$ find . -name "[A-Z]*'' -print

'/usr/local'에서 첫 두글자는 영어 소문자이고 세번째 한자리는 숫자로 시작하는 이름을 가진 파일을 찾을 경우
$ find /usr/local -name "[a-z][a-z][0-9]*'' -print

확장자가 .txt 인 파일을 찾으면서 현재 디렉토리와 한 단계 밑의 디렉토리에서만 파일을 찾을 경우
$ find   -maxdepth 2 -name "*.txt'' -print

현재 디렉토리 밑에서 `zzang'이라는 이름을 가진 사용자 소유의 파일을 찾을 경우
$ find . -user zzang -print

시스템에서 소유자나 그룹이 없는 파일을 찾을 경우 (크래커가 만들어 놓은 파일일 경우도 있음)
$ find / -nouser -o -nogroup -print

자신의 홈 디렉토리에서 최근 3일 동안 변경된 파일들을 찾을 경우
$ find . -mtime -3 -print

'/tmp'에서 최근 5일 동안 변경되지 않은 파일들을 찾아서 삭제할 경우 (파일을 삭제할 때마다 삭제할 것인가를 물어보도록)
$ find . -mtime +5 -print -ok rm {} ;

현재 디렉토리 밑에 있는 모든 포스트 스크립트 파일(.ps)을 찾아서 gzip으로 압축을 하고 그 목록을 result.txt라는 파일에 저정할 경우
$ find . -name "*.ps" -fprint result.txt -exec gzip {} ;

크랙커의 침입이 의심스러워 자신의 시스템에서 suid와 guid가 설정된 일반 파일들을 찾아서 권한을 확인할 경우
$ find / -type f -perm +6000 -print -ls

시스템 관리의 실수로 일반 사용자가 쓰기 권한을 갖도록 설정되어 있는 파일을 찾아서 실행 권한을 없애는 경우 (단, 링크 파일은 제외함)
$ find / -perm +2 ! -type l -print -exec chmod o-w {} ;


7. 기타 활용

현재 디렉토리에서 가장 큰 파일을 찾기

$ find  .  -type  f  | xargs  du  -s  | sort  -n  |  tail  -1

위 한 줄의 명령어는 현재 디렉토리에 서브 디렉토리 포함하여 가장 큰 파일을 하나 찾아서 이를 출력하라는 의미이다.
간혹, 파일 시스템의 FULL이 되어서 가장 큰 파일을 찾으려고 할 경우 아주 유용하다.

*  현재 디렉토리에서 확장자가 cpp 이고 string 이란 문자열이 포함된 파일 검색

$ find / -name "*.cpp" -print -exec grep string {} \

*  현재 디렉토리 위치에서 하위디렉토리를 포함하여 string 이란 문자열을 포함한 파일 검색

$ find . -type f | xargs grep "string"

이 방법은 파일 이름에 공백이 들어갈 경우 문제가 생길 수 있습니다.
공백이 포함된 화일은 아래와 같이 찾아보시면 될거에요
$ find . -type f -print0 | xargs -0 grep "string"

* 현재 디렉토리내에서 확장자가 cpp 이고 string 문자열을 포함하는 파일 검색

파일이름과 내용을 보여주려면..
$ grep string `find . -name \*\.cpp`

파일이름만 보여주려면..
$ grep -l string `find . -name \*\.cpp`

| (파이프, pipe, 수직바) 의 뜻은

"왼쪽 프로그램의 실행 결과를 오른쪽 프로그램의 입력으로 공급하라" 입니다.

파이프 왼쪽 오른쪽 프로그램이 동시에 실행된다는 것은 엄밀히 말하면 틀린얘기입니다.

왼쪽 프로그램이 실행되고 그 결과가 output 되면 오른쪽 프로그램의 input으로 공급되는 것입니다. 동시가 아닌 순차적인 개념입니다.

예를 들면, 

"검색 프로그램의 출력을 정렬 프로그램으로 파이프시킬 수 있고 다시 그 결과를 프린팅 프로그램으로 파이프시키거나 파일로 리다이렉트해서 저장할 수도 있다."


grep 은 가장 유용한 툴 중의 하나입니다.

grep 의 주된 기능은 정규표현식에 매칭되는 문자열을 찾아서 해당 라인만을 출력하는 것입니다.

쉽게 말해, 출력결과(or 입력)에서 찾는 문자열이 있는 라인만 보여주는 기능을 합니다.

egrep은 grep의 확장판인데 두개이상의 문자열을 검색합니다.

# netatte -ap | egrep "aaa|bbb|ccc"

하면  netstate의 결과물중 aaa 혹은 bbb 혹은 ccc가 있는 라인을 출력하는거죠

즉 or 검색이 가능합니다.


grep 하위 디렉토리 까지 조회시 -r 옵션 안될경우

보통 리눅스에서는 grep -r 하위 디렉토리까지 파일을 검색 할수 있게 recursive 옵션을 지원하지만 전통? grep에는 -r 옵션이 없는지 AIX ,HP,Solaris 에서는 -r 옵션을 사용 할수 없다.

그렇다면 여기서 find 와 xargs 를 이용하여 -r 옵션과 같은 실행을 할수 있는 방법은 아래와 같다.

ex) dir : /home/search/cgi-src
 
        1. -r 옵션 이용 : grep -r "include"  /home/search/cgi-src

        2.  find 와 xargs  이용 : find /home/search/cgi-src | xargs grep "include"

뭐 여기서 xargs는  간단하게 말해 파이프 '|' 를 통해 입력 받아서 xargs 뒤에 있는 명령어(grep)한테 파라미터를 주는것.

* xargs 활용 (여러파일 동시에 백업하기)

예를들어 test.cpp
             test1.cpp
             test2.cpp

이런식으로 다수의 파일이 있을떄 일일히 cp 명령어로 .bak 파일을 만드려면 번거로울 것이다.

한번에 처리할 수 있는 방법이 있다.

$ ls test* | xargs -t -i cp {} {}.bak


출처 : http://yonghwa.tistory.com/115


 
TAG Linux, 명령어
TRACKBACK 0    COMMENT 0
  vi 사용 Tip  +   [programming]   |  2008/07/07 16:36
출처 : http://bluezery.com/blog/entry/

1. 명령모드에서 {,} 간의 이동은 %로 자기 scope에 {,} 간에 이동을 한다.

2. 문자열 커서에서 * 또는 # 기호를 누르면 /[문자열] 또는 ?[문자열] 과 같은 기능을 가진다.

3.ctags 를 사용하지 않고 함수나 변수의 원형을 간단히 보는 방법은 명령모드에서 원하는 함수에

커서를 둔 상태에서 [i 를 누르면 화면 하단에 출력된다.

4. 여러 행 탭 넣기

[n]>>(indent 하기)  또는 [n]<<(반대로 indent 하기)

로 원하는 행 밑으로 n개의 행에 탭을 넣을 수 있다.

5. 흐트러진 소스 정렬

정렬을 원하는 부분의 소스를 비주얼 블럭으로 지정하고 = 키를 누르면 자동으로 정렬된다.

전체 는 gg=G 키를 순서대로 누르면 된다.

6. ^M 문자제거

윈도우에서 작성된 문서를 리눅스에서 보면 특수 문자가 찍힌다.

원도우는 엔터가 \r\n 이고 리눅스는 \n 이기 때문이다.

간단하게 :set fileformat=dos 라고 설정하면 된다.

또는 치환 명령 :%s/^M//g 라고 하면 된다.

7. 파일 diff 하기

Acrodiff 같은 diff 기능이 지원된다.

$vimdiff  file1  file2  라고 하면 상당히 비주얼하게 잘 비교되어 나온다.

8. 파일 바로 읽기

원하는 파일의 문자열에서  Ctrl+wf 라고 명령을 하면 셀에 지정된 path 내에서

파일을 검색해서 오픈한다.

9. 자동 완성 기능의 사용

Ctrp+p  :  커서 위치 부터 위로 검색해서 단어 찾기

Ctrl+n   :  커서 위치 부터 아래로 검색해서 단어 찾기


 
TAG TIP, vi
TRACKBACK 0    COMMENT 0
  VIM 명령어  +   [programming]   |  2008/07/02 12:38

1. 저장 및 종료

명령어

설명

:w

저장

:w file.txt

file.txt 파일로 저장

:w » file.txt

file.tx파일에 덧붙여서 저장

:q

vi 종료

:q!

vi 강제 종료

ZZ

저장 후 종료

:wq!

강제 저장 후 종료

:e file.txt

file.txt파일을 불러옴

:e

현재 파일을 불러옴

:e#

바로 이전에 열었던 파일을 불러 옴

 

 

2. 입력모드 전환

a

커서 위치 다음칸부터 입력

A

커서 행의 맨 마지막부터 입력

i

커서의 위치에 입력

I

커서 행의 맨 앞에서 부터 입력

o

커서의 다음행에 입력

O

커서의 이전 행에 입력

s

커서 위치의 한글자를 지우고 입력

cc

커서위치의 한 행을 지우고 입력

 


3. 이동

h

왼쪽으로 이동

l

오른쪽으로 이동

j

아래행으로 이동

k

위 행으로 이동

w 또는 W

다음 단어의 첫 글자로 이동

b 또는 B

이전 단어의 첫 글자로 이동

e 또는 E

단어의 마지막 글자로 이동

<CR>

다음행 글자로 이동

^

그행의 첫 글자로 이동

$

그 행의 마지막 글자로 이동

+

다음 행의 첫 글자로 이동

-

위 행의 첫 글자로 이동

(

이전 문장의 첫 글자로 이동

)

다음 문장의 첫 글자로 이동

{

이전 문단으로 이동

}

다음 문단으로 이동

H

커서를 화면 맨 위로 이동

z<CR>

현재 행을 화면의 맨우로 이동

M

커서를 화면 중안으로 이동

z.

현재 행을 화면의 중앙으로 이동

L

커서를 화면 최하단으로 이동

z-

현재 행의 화면의 최하단으로 이동

[n]H

커서를 위에서 n행으로 이동

[n]L

커서를 아래에서 n행으로 이동

ctrl+u

반 화면 위로 스크롤

ctrl+d

반 화면 아래로 스크롤

ctrl+b

한 화면 위로 스크롤

ctrl+f

한 화면 아래 스크롤

gg 또는 1G

문서의 맨 처음으로 이동

G

문서의 맨 마지막 행으로 이동

[n]G 또는 :[n]

n행으로 이동


 

4. 삭제

x 또는 dl

커서 위치의 글자 삭제

X 또는 dh

커서 바로 앞의 글자 삭제

dw

현재 위치부터 스페이스 까지 삭제

diw

현재 위치에 있는 단어 삭제

dd

커서가 있는 행을 삭제

[n]dd

현재 커서 부터 아래 n번째 줄까지 삭제

dj

현재 커서와 아래 줄 삭제

[n]dj

현재 커서 부터 아래 n+1번째 줄까지 삭제

dk

현재 커서와 윗로 n+1번째 줄까지 삭제

[n]dk

현재 커서와 줄 삭제

D 또는 d$

현재 커서가 있는 위치부터 행 끝까지 삭제

d0 또는 d^

현재 커서가 있는 위치부터 행 시작 까지 삭제

 

 

5. 복사 & 붙여넣기

yy 또는 Y

커서가 있는 한 행 복사

p

현재 커서에 붙여 넣기, 행 복사 일 경우 아래 줄에 붙여넣음.

P

현재 커서위치의 앞행에 붙여 넣기, 행 복사일 경우에는 줄에 붙여 넣음

[n]yy 또는 [n]Y

커서가 위치한 이후로 n행 복사

[n]p

n번 만큼 붙여넣기 반복

 

 

6. 블록 지정

v

블록 지정

V

줄단위 블록 지정

ctrl+v(윈도우에서는 ctrl+q)

비쥬얼 블록 지정

블록 지정 중 명령

y

블록 복사 하기

r

치환

d

지정 블록 지우기

U

대문자로 바꾸기

u

소문자로 바꾸기

~

대소문자 전환

J

행 합침

:

선택 영역에 대하여 ex명령

<

행 앞에 탭 제거

>

행 앞에 탭 삽입

 

 

7. 문자열 탐색 및 치환

/[문자열]

문자열 탐색

:s/old/new

현재 행의 처음 old new로 교체

:s/old/new/g

현재 행의 모든 old new로 교체

:10,20s/old/new/g

10행부터 20행까지 모든 old new로 교체

[블록지정중]:s/old/new/g

지정 블록 내에서 모든 old new로 교체

:-3,+4s/old/new/g

현재 커서 위치에서 위로 3행 아래로 4행까지의 old new로 교체

:%s/old/new/g

문서 전체에서 old new로 교체

:%s/old/new/gc

문서 전체에서 old new로 확인하며 교체

:g/pattern/s/old/new/g

pattern이 있는 모든 행의 old new로 교체

 

 

8. vim 정규 표현식

^

행의 첫 문자([]안에서는 not의 의미)

$

행의 끝

.

아무 문자나 한 문자 의미

\|

or의 의미

[ ]

[]사이의 문자 중 하나

\{min,max\}

min이상 max이하 반복됨

*

앞의 내용이 0번 이상 반복됨

\+

앞의 내용이 1번 이상 반복됨

\<

단어의 시작

\>

단어의 끝

\n

새 행 문자

\t

탭 문자

 

 

9. vim 확장 정규 표현 문자열

\i

변수 지정에 사용되는 문자들 [0-9A-Za-z]

\I

\i와 같지만 숫자는 제외

\k

keyword로 사용하는 문자 [_\.\-0-9A0Za-z]

\f

파일 이름으로 사용하는 문자

\p

프린트 가능한 문자

\P

\p와 같지만 숫자는 제외

\s

whitespace character(공백과 탭)

\S

non-whitespace character

\d

숫자 [0-9]

\D

숫자가 아닌 문자 [^0-9]

\x

16진수 숫자 [0-9A-Fa-f]

\X

16진수 숫자가 아닌 문자 [^0-9A-Fa-f]

\o

8진수 숫자 [0-7]

\O

8진수 숫자가 아닌 문자 [^0-7]

\w

영문 단어의 시작에 사용되는 문자 [0-9A-Za-z-]

\W

영문 단어에서 사용되지 않는 문자 [^0-9A-Za-z-]

\h

영문 단어의 시작에 사용되는 문자 [A-Za-z-]

\H

영문 단어의 시작에 사용 되지 않는 문자 [^A-Za-z-]

\a

모든 알파벳 [A-Za-z]

\A

알파벳이 아닌 문자 [^A-Za-z]

\l

소문자 [a-z]

\L

소문자가 아닌 문자 [a-z]

\u

대문자 [A-Z]

\U

대문자가 아닌 문자 [^A-Z]

\e

Esc

\t

Tab

\r

캐리지 리턴

\b

백스페이스

\n

새 행

 

 

10. POSIX 문자 클래스

문자 클래스

내용

[:alnum:]

알파벳과 숫자 [A-Za-z0-9]

[:alpha:]

알파벳 [A-Za-z]

[:cntrl:]

제어 문자

[:blank:]

탭과 공백 문자

[:digit:]

숫자 [0-9]

[:graph:]

제어문자와 공백 무자를 제외한 문자

[:lower:]

소문자 [a-z]

[:upper:]

대문자 [A-Z]

[:print:]

제어문자를 제외한 문자, 즉 프린터 할 수 있는 문자

[:punct:]

[:graph:]문자 중 [:alnum:]을 제외한 문자. ex)!,@,#,$,%,^....

[:space:]

화이트스페이스 ex)공백, , 케리지 리턴, 새행, 수직탭, 폼필드

[:xdigit:]

16진수

 

 

11. 파일 버퍼

:files 또는 :ls 또는 :buffers

버퍼 목록 나열

:b[n]

n번 버퍼로 이동

:bd[n] 또는 :bw[n]

n번 버퍼를 삭제 (n이 없으면 현재의 버퍼를 삭제)

:bp[n]

이전 버퍼로 이동,n 붙이면 n번만큼 이전 버퍼로 이동

:bn[n]

이후 버퍼로 이동,n 붙이면 n번만큼 이후 버퍼로 이동

:sb[n]

창을 수평분할 하여 n번 버퍼를 로드

:bf

첫 번째 버퍼로 이동

:bl

마지막 버퍼로 이동

양식의

 

12. Tab

Vim 7.0부터 추가된 기능

:tabnew

새로운 탭을 열기

:tabnew b.txt

b.txt가 존재하면 열고, 없으면 새로 만들어서 연다

:tabf b.txt

b.txt가 존재하면 열고, 없으면 에러 발생

:tabn[n]

다음 탭을 열기,n 붙이면 n번 만큼 이동

:tabp[n]

이전 탭을 열기,n 붙이면 n번 만큼 이동

:tabs

탭 목록 보기

:tabclose

탭을 닫기

:tabfirst

첫번째 탭을 열기

:tablast

마지만 탭을 열기

:tabdo %s/old/new/g

모든 탭에 적용을 원할 때 (모든탭에서 old new로 변경)

 


13. 다중 창 관련 명령

명령모드

ex모드

결과

창생성

CTRL-W s

:[N]sp[plit]

현재 파일을 두 개의 수평 창으로 나눔

CTRL-W v

:[N]vs[plit]

현재 파일을 두 개의 수직 창으로 나눔

CTRL-W n

:new

새로운 수평 창 생성

CTRL-W ^ 또는 CTRL-W CTRL-^

 

수평 창으로 나누고 이전 파일의 오픈

CTRL-W f

 

창을 수평으로 나누고 커서 위치의 파일 오픈

CTRL-W i

 

커서 위치의 단어가 정의된 파일을 오픈

창삭제

CTRL-W q

:q[uit]!

현재 커서의 창을 종료

CTRL-W c

:close

현재 커서의 창 닫기

CTRL-W o

:on[ly]

현재 커서의 창만 남기고 모든 창 삭제

창이동

CTRL-W h

 

왼쪽 창으로 커서 이동

CTRL-W j

 

아래쪽 창으로 커서 이동

CTRL-W k

 

위쪽 창으로 커서 이동

CTRL-W l

 

오른쪽 창으로 커서 이동

CTRL-W w

 

창을 순차적으로 이동

CTRL-W p

 

가장 최근에 이동한 방향으로 이동

CTRL-W t

 

최상위 창으로 이동

CTRL-W b

 

최하위 창으로 이동

창이동

CTRL-W r

 

순착으로 창의 위치를 순환

CTRL-W x

 

이전 창과 위치를 바꿈

CTRL-W H

 

현재창을 왼쪽 큰화면으로 이동

CTRL-W J

 

현재창을 아래쪽 큰화면으로 이동

CTRL-W K

 

현재창을 위쪽 큰화면으로 이동

CTRL-W L

 

현재창을 오른쪽 큰화면으로 이동

창 크기 조정

CTRL-W =

 

창의 크기를 모두 균등하게 함

CTRL-W _

 

수평 분할에서 창의 크기를 최대화

CTRL-W |

 

수직 분할에서 창의 크기를 최대화

CTRL-W [N]+

:res[ize] +N

창의 크기를 N행 만큼 증가

CTRL-W [N]-

:res[ize] -N

창의 크기를 N행 만큼 감소

CTRL-W [N]>

 

창의 크기를 오른쪽으로 N칸 만큼 증가

CTRL-W [N]<

 

창의 크기를 오른쪽으로 N칸 만큼 감소

다중창 사용의 경우 대부분 붙여서 사용하는 명령어는 CTRL을 같이 눌러도 똑같은 역활을 하는 경우가 많다.
) CTRL-W j CTRL-W CTRL-J와 같다.

 

 

14. 마킹마킹위치로 이동

m[a-z0-9]

파일내에서 마킹, 현재 버퍼내에서만 이동 함 예)ma

m[A-Z]

전체영역에서 마킹, 다른 파일로도 이동 함.

`[A-Za-z0-9]

마킹된 위치로 돌아감 예)`a

’[A-Za-z0-9]

마킹된 행의 처으으로 이동함. )‘a

직전에 커서가 위치하던 행의 처음

``

직전의 커서 위치로 이동

’”

이전에 vim으로 현재 파일을 닫았을 때 커서가 있던 행의 처음으로 이동

`"

이전에 vim으로 현재 파일을 닫았을 때 커서가 있던 위치로 이동


 
TAG vim
TRACKBACK 0    COMMENT 0
 
 
<<이전   | 1 |   다음>>
 

달빛방랑's Blog is powered by Daum & tistory