검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 쉘 스크립트
참조 원문 : Unix tip: Using Bash's regular expressions

  버전 3(2004년)부터 bash는 =~ 로 표기하는 내장형 정규 표현식 비교 연산자를 갖추었습니다. 그래서 사실 스크립트에서 grep이나 sed로 하는 작업의 상당수는 이 연산자로 처리할 수 있습니다.

  다른 비교 연산자(-lt, == 등)와 마찬가지로 비교 결과가 참이면 0을 리턴합니다. 아래 예제는 $digit의 값이 하나의 숫자인지를 판별하는 것을 보여주고 있습니다.
if [[ $digit =~ [0-9] ]]; then
    echo '$digit is a digit'
else
    echo "oops"
fi

  아래는 프롬프트에 입력한 값이 숫자만으로 구성되어 있는지를 판별하는 예제입니다.
echo -n "Your answer> "
read REPLY
if [[ $REPLY =~ ^[0-9]+$ ]]; then
    echo Numeric
else
    echo Non-numeric
fi

  Bash의 정규 표현식도 상당히 복잡하게 응용해서 사용할 수 있습니다. $email 변수의 값이 이메일 주소 형식인지를 판별하는 예제입니다. 첫 번째 표현식(계정명)은 문자, 숫자, 일부 특수 문자를 받습니다. 첫 번째 ]의 오른쪽에 있는 +는 앞의 표현식에 해당하는 문자를 몇 개든지 받는다는 뜻입니다. 그 뒤에는 계정명과 이메일 도메인 사이에 @ 문자가 있는지 확인합니다. 그리고 도메인 명의 앞부분과 뒷부분 사이에 점(\.)이 있는지 확인합니다.
if [[ "$email" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]
then
    echo "This email address looks fine: $email"
else
    echo "This email address is flawed: $email"
fi

  아래는 변수의 값이 IP 주소 형태인지를 판별하는 예제입니다.
#!/bin/bash

if [ $# != 1 ]; then
    echo "Usage: $0 address"
    exit 1
else
    ip=$1
fi

if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    echo "Looks like an IPv4 IP address"
elif [[ $ip =~ ^[A-Fa-f0-9:]+$ ]]; then
    echo "Could be an IPv6 IP address"
else
    echo "oops"
fi

  또한 bash는 간소화된 루프문을 제공합니다. 100번 루프하고 싶다면 아래의 문법으로 해결할 수 있습니다.
for n in {1..100}
do
    echo $n
done

  아래와 같은 표현식으로 문자나 숫자를 범위로 지정하여 루프를 처리할 수도 있습니다. 꼭 1이나 a부터 시작할 필요는 없으며, 역순으로 처리하는 것도 가능합니다.
{a..z}
{z..a}
{c..f}
{5..25}
{10..-10}

  쉘에서 아래처럼 간단히 확인해볼 수도 있습니다.
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {5..-1}
5 4 3 2 1 0 -1
2013/07/15 12:42 2013/07/15 12:42
Posted
Filed under 시스템
참조 원문 : What is the exact difference between a 'terminal', a 'shell', a 'tty' and a 'console'?

  • 터미널 = tty = 텍스트 입출력 환경
  • 콘솔 = 물리적인 터미널
  • 쉘 = 커맨드 라인 인터프리터
  콘솔, 터미널, tty는 서로 깊은 연관을 갖고 있는데 본래 이것들은 컴퓨터와 상호작용을 위한 장비를 뜻합니다. 초기 유닉스 시절에 타자기를 닮은 전신 타자기(텔리프린터) 스타일의 장비를 사용했으며 이를 텔리타입라이터나 이를 줄여 'tty'라고 불렀던 것이죠. 터미널이란 용어는 전자적 관점에서 생긴 용어이며, 콘솔은 가구적인 관점에서 생긴 용어입니다. 유닉스 역사 중 극초반 시절에는 전자 키보드와 디스플레이 한 세트가 터미널의 표준 모습이었습니다.

  유닉스 전문 용어로 tty는 단순히 읽기와 쓰기를 넘어 몇 가지 추가적인 명령어를 지원하는 디바이스 파일을 뜻합니다. 그리고 터미널은 사실상 이 tty와 동일한 의미로 사용됩니다. 일부 tty는 하드웨어 디바이스를 위해 커널이 제공하며 그 예로 키보드에서 들어오는 입력과 텍스트 모드 화면으로 나가는 출력, 시리얼 라인을 통해 전송되는 입출력이 있습니다. 그 외의 tty는 씬 커널 레이어를 통해 터미널 에뮬레이터라고 불리는 프로그램으로 제공되며 이런 tty를pseudo-tty로 부르기도 합니다. 터미널 에뮬레이터로는 Xterm(X 윈도우 시스템), Screen(프로그램과 다른 터미널 사이에 독립적인 계층을 제공), SSH(한 머신에서 프로그램으로 다른 머신의 터미널에 연결), Expect(스크립팅 터미널 인터랙션용) 등이 있습니다.

  터미널이라는 단어는 컴퓨터와 상호작용을 하기 위한 디바이스라는 더 고전적인 의미도 가지고 있는데 이는 일반적으로 키보드와 디스플레이로 구성됩니다. 예를 들어 X 터미널은 씬 클라이언트의 일종으로서 키보드, 디스플레이, 마우스, 경우에 따라 그 외의 인터랙션용 주변 장치의 수용만을 위해 존재하는 특수목적 컴퓨터이며 이때 실제 애플리케이션은 더 성능이 좋은 다른 컴퓨터에서 실행됩니다.

  콘솔은 일반적으로 머신과 직접 연결된 물리적인 1차 터미널을 말합니다. 콘솔은 OS에서 커널에 의해 tty로 나타납니다. 리눅스나 FreeBSD 등 일부 시스템에서는 다수의 tty가 존재합니다.(특수한 키 조합으로 이 tty사이를 옮겨다닐 수 있습니다.)

  은 유저가 로그인했을 때 볼 수 있는 1차 인터페이스로서 그 주목적은 다른 프로그램을 실행하는 것입니다. 유닉스에서는 커맨드라인 쉘을 뜻하는 경우가 대부분이며 다른 종류의 작업 환경에는 쉘이란 단어를 쓰지 않는 편인데 예를 들어 윈도우 시스템에서는 Window Manager와 Desktop Environment라는 용어를 사용합니다. 유닉스에는 많은 쉘이 있지만 대부분은 Bourne Shell의 문법을 기반으로 합니다. 터미널과 쉘의 업무영역을 구분짓는 것은 쉽지 않은편인데 아래는 주요 역할의 예제들입니다.
  • 입력: 터미널은 키를 컨트롤 시퀀스로 변환(예: 왼쪽 방향키 -> \e[D)시킵니다. 쉘은 컨트롤 시퀀스를 명령어로 변환(\e[D -> backward-char)시킵니다.
  • 줄 편집, 입력 히스토리, 자동 완성은 쉘에 의해 제공된다.
    • 터미널이 줄 편집, 히스토리, 자동 완성을 대신 제공하고 완성된 최종 내용을 쉘에 전달하는 경우도 있다. 일반 터미널 중 이런 방식으로 작동하는 것은 Emacs의 M-X 쉘 뿐이다.
  • 출력: 쉘이 "'foo'를 출력하라", "포어그라운드 색을 초록색으로 변경하라", "커서를 다음 줄로 옮겨라" 같은 명령을 내리고 터미널은 이 명령을 수행한다.
  • 프롬프트는 전적으로 쉘이 담당한다.
  • 쉘은 자신이 실행한 명령의 출력 결과를 전혀 보지 않는다.(단, 리다이렉트된 것은 제외.) 출력 히스토리(스크롤 되돌리기)는 전적으로 터미널이 담당한다.
  • 애플리케이션 사이의 복사/붙여넣기는 터미널이 제공한다.(일반적으로 마우스나 Ctrl+Shift+V, Shift+Insert 같은 키 시퀀스를 사용.) 쉘이 자체적인 복사/붙여넣기 메커니즘을 가지고 있는 경우도 있다.(예: Meta+W와 Ctrl+Y)

 

2013/06/23 13:47 2013/06/23 13:47
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : My top ten shell/bash tricks!


1. sudo를 사용하는 것을 잊었을 때 !! 활용
  루트 권한이 필요한 명령어를 사용할 때 sudo를 사용하는 것을 잊어서 처음부터 다시 타이핑을 하거나 이전 명령어를 불러 앞 부분에 sudo를 붙이는 경우가 있는데 더 간편하게 하는 방법이 있습니다. 바로 이전에 실행한 명령어로 대체되는 '!!' 문자열을 사용하는 겁니다. 배시 쉘에서 사용이 가능합니다.
$ ethtool eth0
Settings for eth0:
Cannot get device settings: Operation not permitted
Cannot get wake-on-lan settings: Operation not permitted
    Current message level: 0x00000000 (0)
Cannot get link status: Operation not permitted
$ sudo !!
sudo ethtool eth0
[sudo] password for mirashi:


2. Ctrl+R로 이전에 사용한 명령어 찾기
  역시 배시 쉘에서 사용이 가능한 기능으로 Ctrl+R을 누른 후 이전에 사용한 명령어에 포함된 문자나 문자열을 입력하여 이전에 사용한 명령어를 검색할 수 있습니다. 검색은 가장 최근 실행한 것부터 역순으로 검색되며 Ctrl+R을 누를 때마다 검색을 계속 진행합니다. 그냥 Ctrl+R만 계속 누를 경우 이전에 실행한 명령어들을 차례대로 보여줍니다. 역시 배시 쉘에서 가능합니다.

  이전에 실행한 명령어를 검색하는 또 다른 방법으로는 'history | grep 검색할_명령어'를 실행하는 방법이 있습니다.


3. 가장 많이 실행했던 명령어 10개 보기
$ history | tr '\011' ' ' | tr -s " "| cut -d' ' -f3 | sort | uniq -c | sort -nbr | head -n10
    212 sudo
     38 man
     26 ls
     24 cd
     23 echo
     15 vi
     15 awk
     13 dig
     12 lsof
      9 htpasswd


4. 한방에 시스템을 무너트리는 명령어
  아래의 명령어로 시스템에 DoS 공격을 할 수 있습니다. fork bomb이라고 하는 공격이며 프로세스 복제로 프로세스 테이블을 포화상태로 만듭니다.
:(){ :|:& };:


5. &&로 연쇄 반응 일으키기
  '&&'는 명령어를 순차적으로 실행하게 해줍니다. 만약 '명령어1 && 명령어2'이라는 형식으로 실행하면 '명령어1'이 실행되어 무사히 종료됐을 경우에만 '명령어2'가 실행됩니다. 여기서 중요한 사실은 만약 '명령어1'의 종료 값이 0이 아닐 경우(=비정상 종료했을 경우) '명령어2'가 실행되지 않는다는 겁니다. 아래는 데비안 계열의 배포판에서 이 기법을 활용한 예로 패키지 목록을 업데이트한 후 패키지 업데이트를 실행하는 명령어입니다.
sudo apt-get update && sudo apt-get upgrade


6. screen 명령어로 화면 분할
  먼저 'screen' 명령어를 실행합니다. 그리고 엔터를 눌러 쉘 화면으로 빠져나옵니다. 이제 Ctrl+a를 누른 후 S(대문자)를 누르면 화면이 분할됩니다. 이제 Ctrl+a를 누른 후 탭을 누르면 다음 창으로 넘어갈 수 있습니다. 분할 후 새로 생긴 창에는 아무것도 없는데 커서가 그런 창에 있는 상태에서 Ctrl+a를 누른 후 c(소문자)를 누르면 쉘이 실행됩니다. 현재 커서가 있는 창을 닫고 싶을 때는 Ctrl+a를 누른 후 X(대문자)를 누르면 됩니다.

2010/12/14 17:05 2010/12/14 17:05