wc 명령어를 사용해서 파일 또는 입력의 바이트, 문자, 단어 그리고 줄(라인) 수를 세는 방법을 알아보자.


환경

  • Linux 기반 시스템
  • Bash shell(/bin/bash)


wc 명령어

wc 명령어란?

wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F
  • wc : 주어지는 파일 또는 표준 입력의 바이트, 문자, 단어 그리고 줄(라인) 수를 출력해주는 명령어입니다.
  • wc는 ‘word count’를 의미한다고 합니다.
  • ls -al과 함께 폴더와 파일의 수를 알고 싶을때 응용이 가능합니다.


옵션별 사용법

예제에 사용할 파일 작성

  • ASCII용 예제
$ cat << EOF > test_ascii.txt
123
abc def hij
lmn opq rs
EOF

$ file test_ascii.txt
test_ascii.txt: ASCII text
  • UTF-8용 예제
$ cat << EOF > test_utf.txt
한국어 배워보세요.
감사합니다. 또 봐요!
EOF

$ file test_utf.txt
test_utf.txt: UTF-8 Unicode text

-c, –bytes 옵션

  • 파일의 바이트 수를 출력합니다.
$ wc -c test_ascii.txt
27 test_ascii.txt
# You can use it with cat command
$ cat test_ascii.txt | wc -c
27

-m, –chars 옵션

  • 문자들의 수를 출력합니다.
$ wc -m test_ascii.txt
27 test_ascii.txt
# You can use it with cat command
$ cat test_ascii.txt | wc -m
27
  • ASCII에서는 문자의 수가 곧 바이트의 수지만(문자당 1바이트) 다른 문자 형식에서는 아닐수도 있습니다.
$ wc -m test_ascii.txt
27 test_ascii.txt

$ wc -c test_ascii.txt
27 test_ascii.txt
$ wc -m test_utf.txt
24 test_utf.txt

$ wc -c test_utf.txt
56 test_utf.txt

-l, –lines 옵션

  • 줄(라인 또는 개행문자)의 수를 출력합니다.
$ wc -l test_ascii.txt
3 test_ascii.txt
$ cat test_ascii.txt | wc -l
3
  • 특정 폴더에서 파일이나 폴더의 수를 알고 싶을 때 ls -al과 같이 사용가능합니다.
$ ls -al | wc -l
9

-w, –words 옵션

  • 단어의 수를 출력합니다.
$ wc -w test_ascii.txt
7 test_ascii.txt
$ wc -w test_utf.txt
5 test_utf.txt


참고자료

Let’s count number of bytes, characters, words and lines in file or input.


Environment and Prerequisite

  • Linux base system
  • Bash shell(/bin/bash)


wc command

What is wc command?

wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F
  • wc : print newline, word, and byte counts for each file or input
  • wc stands for ‘word count’
  • You can use it with ls -al when count number of files and directories in specific path


Usage with each option

Make sample files for examples

  • ASCII sample
$ cat << EOF > test_ascii.txt
123
abc def hij
lmn opq rs
EOF

$ file test_ascii.txt
test_ascii.txt: ASCII text
  • UTF-8 sample
$ cat << EOF > test_utf.txt
한국어 배워보세요.
감사합니다. 또 봐요!
EOF

$ file test_utf.txt
test_utf.txt: UTF-8 Unicode text

-c, –bytes option

  • print the byte counts.
$ wc -c test_ascii.txt
27 test_ascii.txt
# You can use it with cat command
$ cat test_ascii.txt | wc -c
27

-m, –chars option

  • print the character counts.
$ wc -m test_ascii.txt
27 test_ascii.txt
# You can use it with cat command
$ cat test_ascii.txt | wc -m
27
  • In ASCII format, the number of bytes and characters are same but some of other formats would be not.
$ wc -m test_ascii.txt
27 test_ascii.txt

$ wc -c test_ascii.txt
27 test_ascii.txt
$ wc -m test_utf.txt
24 test_utf.txt

$ wc -c test_utf.txt
56 test_utf.txt

-l, –lines option

  • print the newline counts.
$ wc -l test_ascii.txt
3 test_ascii.txt
$ cat test_ascii.txt | wc -l
3
  • You can count number of files and directories in specific path by using it with ls -al.
$ ls -al | wc -l
9

-w, –words option

  • print the word counts.
$ wc -w test_ascii.txt
7 test_ascii.txt
$ wc -w test_utf.txt
5 test_utf.txt


Reference

tcpdump 명령어를 이용해서 패킷들을 덤프(dump)하고 와이어샤크로 열어보자


환경

  • Linux 기반 시스템
  • Bash shell(/bin/bash)
  • tcpdump 명령어
  • Wireshark


tcpdump 명령어

tcpdump 명령어란?

tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]

[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
  • tcpdump : 네트워크 인터페이스를 통해 지나가는 패킷들의 내용을 출력해주는 명령어로 여러 옵션을 이용해 패킷들의 오고가는 내용을 볼 수 있다.
  • 네트워크 패킷들을 다 조사하는것이기 때문에 root권한이 필요합니다.


특정 인터페이스 패킷들을 파일로 저장하기

기본 사용법

  • -i [inferface name] : 패킷들의 내용을 출력하고 싶은 인터페이스의 이름을 옵션으로 줍니다.
  • -w [file name] : 패킷들의 내용을 파일로 저장하고 싶을 때 사용하는 옵셥입니다.
tcpdump -i [interface name] -w [file name]

예제

  • eth0 인터페이스에 오고가는 패킷들을 test.pcap으로 저장하기
  • pcap : 와이어샤크에서 사용하는 파일 형식으로 캡처된 패킷들이 저장되는 파일 형식이다.
  • Ctrl + C를 통해서 종료가 가능하다.
$ sudo tcpdump -i eth0 -w test.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
860 packets captured
862 packets received by filter
0 packets dropped by kernel


와이어샤크

와이어샤크란?

  • 가장 널리쓰이는 네트워크 프로토콜 분석 도구로 아주 작은 레벨까지 네트워크 분석이 가능하며 사실상 표준(de facto)이 된 소프트웨어이다. 상업적 또는 비영리 목적으로 상당히 많이 사용한다.


pcap 형식의 파일을 와이어샤크로 열기

  • (방법1) 파일을 드래그 앤드 드롭(Drag-and-drop)을 이용해 열 수 있다.
  • (방법2) File-Open에서 파일 선택


주소 값으로 필터링하기

  • 특정 IP주소에 해당하는 패킷만 필터링하려면 메뉴에 있는 “Apply a display filter”에 필터를 추가하면 된다.

ip address filter

ip.addr==X.X.X.X
ip.src==X.X.X.X
ip.dst==X.X.X.X

AND condition

(ip.src==X.X.X.X) || (ip.dst==X.X.X.X)

OR condition

(ip.src==X.X.X.X) && (ip.dst==X.X.X.X)


참고자료

Dump packets using tcpdump command and open it using wireshark


Environment and Prerequisite

  • Linux base system
  • Bash shell(/bin/bash)
  • tcpdump command
  • Wireshark


tcpdump command

What is tcpdump command?

tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]

[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
  • tcpdump : prints out a description of the contents of packets on a network interface with various options.
  • It scans all packets on network so it needs root privilege


Save specific interface’s packets as file

Basic usage

  • -i [inferface name] : give interface name as option
  • -w [file name] : give file name as option
tcpdump -i [interface name] -w [file name]

Example

  • Save eth0 interface’s packets as test.pcap
  • pcap : packet captured file format used in wireshark
  • Use Ctrl + C to quit capturing.
$ sudo tcpdump -i eth0 -w test.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
860 packets captured
862 packets received by filter
0 packets dropped by kernel


Wireshark

What is wireshark?

  • The world’s foremost and widely-used network protocol analyzer.
  • It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions.


Open pcap file using wireshark

  • (방법1) Drag-and-drop is also possible
  • (방법2) Choose file in File-Open tab


Filtering using ip address

  • If you want to filter specific ip address, then add filter to menu’s “Apply a display filter”

ip address filter

ip.addr==X.X.X.X
ip.src==X.X.X.X
ip.dst==X.X.X.X

AND condition

(ip.src==X.X.X.X) || (ip.dst==X.X.X.X)

OR condition

(ip.src==X.X.X.X) && (ip.dst==X.X.X.X)


Reference

백그라운드로 명령어를 실행해서 병렬적으로 실행되는 멀티 프로세스 환경을 만들어보자.


환경

  • Linux 기반 시스템
  • Bash shell(/bin/bash)


멀티프로세스? 병렬처리? 멀티스레드? 백그라운드 프로세스?

  • 여기서 진행할 방식은 & 연산자를 이용해 명령어나 쉘스크립트의 내용을 백그라운드로 실행시키는 방식을 사용할 예정입니다.
  • 여기저기 찾아본 결과 & 연산자를 이용하면 해당 명령어나 스크립트는 현재 실행되는 프로세스의 자식 프로세스를 생성하여 새로운 서브쉘에서 실행된다고 합니다.
  • 정확하게 명칭을 멀티프로세스나 멀티스레드라고 부르기 애매하나… 영문 자료들에서 & 연산자를 이용해 자식 프로세스를 만든다고 하여 멀티프로세스라고 이름 지었습니다. 혹시 다른 내용이나 더 정확한 내용을 알고 계시면 자료 첨부와 함께 댓글 달아주시면 감사하겠습니다 :)


리눅스 &(Ampersand) 연산자

& 연산자란?

  • 리눅스 환경에서 명령어를 실행할 때 현재 사용하고 있는 쉘이 아닌 새로운 서브쉘을 생성해서 백그라운드에서 실행할 때 사용하는 명령어입니다.
  • &를 사용해서 명령어나 스크립트를 실행하면 백그라운드로 해당 명령어나 스크립트가 실행되며 쉘에서 다른 작업을 계속 할 수 있습니다.
  • 다음 아래 예제들처럼 원하는 명령어를 다 입력한 후에 &를 붙여주면 됩니다.


& 연산자 예제

  • (예제) sleep을 백그라운드에서 실행하기
$ sleep 10 &
[1] 79287
$ # Type enter to make below result
[1]+  Done                    sleep 10
  • (예제) shell script를 백그라운드에서 실행하기
  • 다음 아래처럼 명령어 > 파일명 & 방식을 이용해 stdout을 로그파일로 남길수도 있습니다.
$ tee test_shell.sh << EOF
> #!/bin/bash
>
> echo 1
> sleep 1
> echo 2
> sleep 1
> echo 3
> EOF
echo 1
sleep 1
echo 2
sleep 1
echo 3
$ ./test_shell.sh > tmp_test_shell.log & # You can redirect stdout to specific file.


(예제) 쉘스크립트 함수를 백그라운드에서 병렬로 사용하기

설명

  • 함수를 만들고 해당 함수에 인자를 전달해서 백그라운드로 돌리는 예제를 작성해보겠습니다.
  • 아래 예제는 배열에 있는 원소들을 인자로 전달하여 랜덤한 값에 따라 sleep을 하는 스크립트입니다. &를 사용하지 않는다면 각각 배열의 원소에 대하여 랜덤한 시간만큼 sleep이 끝날 때까지 순차적으로 기다리겠지만 &를 사용했기 때문에 각각의 작업은 백그라운드에서 따로 진행됩니다.
  • 각각 자식 프로세스들이 잘 생성되고 실행되었는지를 확인하기 위해 배열 원소의 이름으로 로그 파일을 만들었습니다.


코드

test_multi_process.sh

#!/bin/bash

function back_ground_process () {
	# Random number between 10 and 15
	sleep_time=$(($RANDOM*12345%6 + 10))

	echo "${1} will sleep for ${sleep_time} seconds"

	sleep ${sleep_time}

	echo "${1} sleep done!"
}

# array in shell script
arr=("a_worker" "b_worker" "c_worker")

# @ means all elements in array
for i in ${arr[@]}; do
    # run back_ground_process function in background
    # pass element of array as argument
    # make log file
    back_ground_process $i > ~/log_${i}.txt &
done
  • wait라는 명령어를 사용하면 현재 실행된 스크립트에서 생성된 모든 자식 프로세스 및 백그라운드 작업을 기다릴수 있습니다.

test_multi_process.sh(continue)

...
# @ means all elements in array
for i in ${arr[@]}; do
    # run back_ground_process function in background
    # pass element of array as argument
    # make log file
    back_ground_process $i > ~/log_${i}.txt &
done

# wait until all child processes are done
wait

echo "All background processes are done!"


결과

  • 실행하고 바로 로그 파일들을 확인합니다.
  • 쉘 스크립트는 백그라운드로 작업을 각각 돌리고 바로 종료되는걸 볼 수 있습니다.
$ ./test_multi_process.sh
$ cat log_a_worker.txt && cat log_b_worker.txt && cat log_c_worker.txt
a_worker will sleep for 13 seconds
b_worker will sleep for 13 seconds
c_worker will sleep for 10 seconds
  • 15초 정도가 지난후에 로그파일들을 보면 각각의 프로세스가 끝났음을 알 수 있습니다.
$ cat log_a_worker.txt && cat log_b_worker.txt && cat log_c_worker.txt
a_worker will sleep for 13 seconds
a_worker sleep done!
b_worker will sleep for 13 seconds
b_worker sleep done!
c_worker will sleep for 10 seconds
c_worker sleep done!


응용

  • 위와 같이 &를 사용해서 사용하고 싶은 데몬이나 프로세스들을 백그라운드로 실행할 수 있습니다.
  • 예를 들어서 여러개의 컴퓨터에 동시에 접속해서 어떤 파일을 설치하는 명령어들을 백그라운드로 병렬로 실행해서 시간을 단축시킬 수 있으며 현재 쉘에서 특정 프로그램을 실행 시키고 계속 현재 쉘을 사용하고 싶을 때 유용합니다.
  • 추가적으로 쉘 스크립트에서 백그라운드로 멀티 프로세스를 진행시키고 싶을 때 사용이 가능합니다.


참고자료