sed, awk, bash 리눅스 관련


* linux 기초 관련
용량 관련
df -h
ls -lh
du -sk *
du -sh *

which, whereis, finding

마운트는 /dev와 연관된 것
mount -t iso9660 /dev/cdrom /mnt/cdrom
umount /mnt/cdrom

stdin(0), stdout(1), stderr(2), >, >>(redirection), |(pipe)
표준 오류(stderr)를 파일로 보내려면 2>을 사용
표준 출력(stdout)과 표준 오류(stderr) 모두를 파일로 보내려면 &>를 사용
재지정 방법을 조합해도 됨. 예컨대 2>>는 표준 오류를 파일에 첨부함
>(1>), 2>, &>, 1>&2, 2>&1(우측 2개는 재지향 아님. 합쳐주는 것. pipe로 보면 결과 나옴)

head -n 2 listing2.txt
tail

* sed 용법
http://www.ibm.com/developerworks/kr/linux/library/l-sed1.html
http://www.ibm.com/developerworks/linux/library/l-sed1.html
http://www.ibm.com/developerworks/linux/library/l-sed2.html
http://www.ibm.com/developerworks/linux/library/l-sed3.html

sed는 stream editor로서 stream에 대해서 줄 단위로 작업함.
sed -e '1,10d' /etc/services | more
sed -e '/^#/d' /etc/services | more
sed -n -e '/regexp/p' /path/to/my/test/file | more
sed -n -e '/BEGIN/,/END/p' /my/test/file | more' // BEGIN에서 END가 나오는 라인까지 print
sed -n -e '/main[[:space:]]*(/,/^}/p' sourcefile.c | more
'[[:space:]]' 문자 클래스 - sed에게 탭 또는 공간을 찾도록 명령하는 특별한 키워드
'[[:space:]]'를 타이핑하는 대신 '[' 타이핑 후 빈 공간, Control-V, 탭, ']'순서로 타이핑
Control-V 는 명령어 확장을 수행하기보다 실제 탭을 삽입해야 한다는 것을 의미
Character Class
[:alnum:], [:alpha:], [:blank:], [:cntrl:], [:digit:], [:graph:], [:lower:]
[:print:], [:punct:], [:space:], [:upper:], [:xdigit:]

sed -e '1,10s/enchantment/entrapment/g' myfile2.txt
sed -e '/^$/,/^END/s/hills/mountains/g' myfile3.txt
sed -e 's:/usr/local:/usr:g' mylist.txt
sed -e 's/<[^>]*>//g' myfile.html
sed -e 's/.*/ralph said: &/' origmsg.txt // & - entire matched regular expression
sed -e 's/\(.*\) \(.*\) \(.*\)/Victor \1-\2 Von \3/' myfile.txt // \1, \2, \3 ... matched region

sed -n -e '=;p' myfile.txt // 여러 개의 명령은 ';'(semicolon) 문자로 분리해서 실행 가능
sed -n -e '=' -e 'p' myfile.txt // 각 명령 앞에 명시적으로 -e 옵션을 줄 수도 있음
sed -n -f mycommands.sed myfile.txt // 명령 스크립트를 가지고 실행

1,/^END/{
s/[Ll]inux/GNU\/Linux/g // 단일 주소에 다중 명령을 실행하고 싶을 경우 {}(brace)로
s/samba/Samba/g
s/posix/POSIX/g
p
}

VirtualHost# cat t.sed // i\, a\, c\ - 각각 insert before, append after, change line. 파일 스크립트로 작성해야 함
i\
head test
sed -f t.sed /etc/services

sed -e 's/$/\r/' myunix.txt > mydos.txt
sed -e 's/.$//' mydos.txt > myunix.txt

objdump -d hello | sed -ne '/
:/,/^$/p
sed 12, 18d /tmp/dummy // /tmp/dummy 파일에서 12-18라인을 제외한 모든 줄을 보여줌

* awk 용법 - 문자열 처리. 변수 이용 등
https://www.ibm.com/developerworks/kr/library/tutorial/au-unixtips1/
https://www.ibm.com/developerworks/kr/library/tutorial/au-unixtips2/
https://www.ibm.com/developerworks/kr/library/tutorial/au-unixtips3/
https://www.ibm.com/developerworks/kr/library/tutorial/au-unixtips4/

awk gawk - 개발한 세 사람의 이름 Aho, Weinberger, Kernighan에서 유래된 것

sed 명령 표현식은 4부분으로 나뉨
sed s/REGULAREXPRESSION/REPLACEMENTSTRING/flags INPUT_FILE
sed /nodes/s/logfile/logfile_nodes/ sed.txt // 선행 검색. 라인이나 내용까지
sed 's/[a-z]*:/new_&/g' sed.txt

기본적으로 sed는 첫 번째 인수를 정규 표현식으로 인식하지만,
여러 명령을 실행할 때는 첫 번째 명령 앞에도 명시적으로 -e 플래그를 붙이는 편이 낫다

awk는 한 걸음 더 나가서 정규 표현식을 완벽한 명령행 프로그래밍 언어로 사용한다
입력 행에 있는 각 문자열을 코드에서 변수로 참조할 수 있다. 이 변수는 인라인 코드에서 입출력에 사용된다.

ls -l | awk ' { print $3 " " $9 } '
ls -l | awk ' /root/ { print $3 " " $9 } '
ls | awk -F"." ' /txt/ { print "mv " $1 "." $2 " " $1 ".doc" } ' | bash
-F : 입력 처리 시의 분리 문자임.
처리 결과를 bash로 넘길 수도 있음.

---------------------------------------------------------------------------------------------
패 턴 의 미
---------------------------------------------------------------------------------------------
/fish/ 문자열 fish를 포함하고 있는 라인
$1 - /fish/ 첫번째 필드가 문자열 fish를 포함하고 있는 라인
$3 - /fish/ 세번째 " "
$1! - /fish/ 첫번째 필드가 문자열 fish를 포함하고 있지 않은 라인
---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------
작 용 의 미
---------------------------------------------------------------------------------------------
{print $2} 두번째 필드만을 프린트하라
{print $4,$2} 네번째 필드의 내용을 프린트한 다음 두번째 필드의 내용을 프린트하라
{print $2,$2+$4} 두번째 필드를 프린트한 다음 두번째 필드와 네번째 필드의 합을 프린트하라
{s=$2+$4; print s} 두번째와 네번째 필드를 추가한 다음, 그 합을 프린트하라
---------------------------------------------------------------------------------------------
http://stone.backrush.com/sunfaq/ljs006.html
http://ko.wikibooks.org/wiki/%EC%98%88%EC%A0%9C%EB%A1%9C_%EB%B0%B0%EC%9A%B0%EB%8A%94_AWK/%EB%AA%85%EB%A0%B9%ED%96%89_%EC%9D%B8%EC%9E%90_%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

sum.awk
BEGIN{
total = 0;

for(i= ARGV[1] ; i <= ARGV[2] ; i++) { total = total + i; } print total; } gawk -f sum.awk 2 2000 awk '/test/ {print}' /tmp/dummy // 간단한 용법으로 sed와 비슷한 용법임 awk '/test/ {i=i+1} END {print i}' // test 문자가 매치되는 라인의 수를 구함 grep "look for this" /var/log/messages -c // "look for this"가 발견된 수를 얻음 wc --words --lines --bytes /tmp/dummy // 옵션 그대로의 의미 * vi 추가 . - 마지막 명령 반복 검색 시(/?) cw로 단어 바꾸어준 후 n 명령으로 다음에 대해서 .를 눌러 동일하게 교체하면 유용 u - 실행한 명령 취소, ctrl-r - 명령 다시 실행 * bash 관련 - http://linuxcommand.org/. 매뉴얼도 참조 http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/ http://wiki.kldp.org/wiki.php/DocbookSgml/Bash-Prog-Intro-HOWTO 인용 부호 유형 세 가지(인용 부호의 정확한 규칙은 쉘마다 다름) 역슬래시(\)로 시작하는 문자 하나를 인용부호로 감싸는 경우: 특수 문자나 셸 메타문자를 특수한 의미 없이 있는 그대로 넘김. 이중 인용부호(")로 문자열을 감싸 확장된 문자열을 넘기는 경우: 달러($) 기호나 단일 인용부호(')가 특수한 의미를 유지함. 문자열에서 변수 이름이 값으로 교체됨. 단일 인용부호(')로 문자열을 감싸 있는 그대로 넘기는 경우: 모든 변수 이름, 메타문자, 특수 문자 등이 있는 그대로 전달됨. 의미는 해석되지 않음. myvar = "Hello, world" // 이 형식으로 변수 대입하려면 특정 설정 또는 환경이 필요한 것으로 보임 set myvar="Hello, world" # 기호 - 주석. 인용될 수 있음. 인용 내에서는 그대로 인정됨 varr="Hello, world" // 공백이 없는 방식으로 작동함. export myvar="Hello, world" declare -x myvar="Hello, world" let myvar="Hello, world2" unset myvar let COUNTER=COUNTER+1 let COUNTER-=1 var=$(($var+1)) var=$(($var-1)); variable1이 변수 이름이라면 $variable1은 그 변수가 갖고 있는 데이타 아이템인 값을 나타냄 변수 선언, 할당, unset 시, export 시만 $ 없이 쓰임. 변수 할당은 =을 쓰거나(var1=27 처럼), read 문에서 쓰이거나, 루프문의 처음에서 쓰임(for var2 in 1 2 3) $variable은 ${variable}을 짧게 쓴 표현임 pubuntu@pubuntu:~/test$ HELLO=hello pubuntu@pubuntu:~/test$ function hello { > local HELLO=world // 지역 변수는 local 키워드로 생성됨
> echo $HELLO
> }
pubuntu@pubuntu:~/test$ echo $HELLO
hello
pubuntu@pubuntu:~/test$ hello
world
pubuntu@pubuntu:~/test$

echo $(ls)
$(( expression )) - 수식 표현, 산술 확장
echo $((5*(3+3)))
echo $[1+12] // 좀 더 논리적이고 정통적인 방법. bash는 정수 계산만 가능함. 복잡한 것은 bc 이용

#!/bin/bash -x // 이해할 수 없는 동작을 할 때 첫 줄을 수정하면 실행 과정 정보를 하나씩 출력해줌


freebsd에서 개별적으로 설치한 bash의 경우(이 경우 echo -e 등이 제대로 작동함)
/bin/sh과 /usr/local/bin/bash와 작동이 약간 다름
toor:*:0:0:Bourne-again Superuser:/root:/usr/local/bin/bash

/bin/csh에서 bash로 변경
chsh -s /usr/local/bin/bash

http://lantech.geekvenue.net/chucktips/jason/chuck/1035144363/index_html
http://www.softlab.ntua.gr/facilities/documentation/unix/shelldiff.html

* kisa
objdump -d -M intel hello
set disassembly-flavor intel
set disassembly-flavor att
show disassembly-flavor
strace - system call tracer. 프로그램 실행 중 시스템 콜 호출 내용을 표시해주는 도구

댓글