기본명령어 1에 이어서 작성합니다.
■ 10. wc 명령어
"파일안에 단어의 갯수 또는 라인수를 출력하는 명령어"
"print
word count"
예:
$ wc -l 파일명
옵션 |
설명 |
-l |
라인수 출력 |
-w |
단어의 갯수 출력 |
-c |
문자수를 출력(바이트 크기) |
[orcl:~]$ wc -l winter.txt
4240 winter.txt
문제. winter.txt 의 단어수를 출력하시오
[orcl:~]$ wc -w winter.txt
19909 winter.txt
위 옵션 3개를 한꺼번에 보고 싶다면??
[orcl:~]$ wc winter.txt
4240 19909 111181 winter.txt
문제. 자신의 홈디렉토리 밑에 확장자가 .txt로 끝나는 파일이 몇 개가 있는지 카운트 하시오
[orcl:~]$ wc -l *.txt
0 1.txt
3 10.txt
0 2.txt
5 20.txt
0 3.txt
6 30.txt
2 ANALYST.txt
4 CLERK.txt
3 MANAGER.txt
1 PRESIDENT.txt
4 SALESMAN.txt
0 a.txt
41 all.txt
0 b.txt
0 c.txt
0 d.txt
5 dept.txt
0 e.txt
15 emp.txt
14 emp400.txt
0 f.txt
0 g.txt
0 h.txt
3 hhh.txt
3 hhh3.txt
10 result.txt
0 saelsman.txt
6 salgrade.txt
1125 sar_20181219.txt
1004 sar_20181220.txt
4240 winter.txt
6494 total
[orcl:~]$ ls -l *.txt | wc -l
31
$wc -l 을 어디에 쓰느냐에 따라 값이 다르게 나온다.
*스트링으로 연결해서 2개의 명령어를 사용할 수 있다.
※ 설명: 앞의 명령어 | 뒤의 명령어
앞의 명령어의 표준출력을 뒤의 명령어의 표준입력으로 보냄으로서
명령어의 실행결과를 다음 명령어로 전달하는 기능
문제. 홈디레토리 밑에 파일이 몇 개가 있는지 조회하시오
[orcl:~]$ ls -l * | wc -l
264
[orcl:~]$ ls -l | wc -l
132
위 2개 값이 다른 이유는, * 을 사용할 경우 표, 주석과 같은 정보 외 값들도 카운트 된다.
우리가 원하는 값을 출력하려면 * 을 안쓰는게 맞다.
■ 11. grep 명령어
"파일안에 포함된 특정 단어나 구문을 검색하는 명령어"
예:
$ grep '찾고 싶은 단어' 파일명
$ grep -i
'scott' emp.txt
설명: emp.txt 에서 scott 이라는 단어가 포함 된 라인을 보여달라
-i 옵션: 대소문자를 구분하지 않겠다
문제. 직업이 salesman 인 사원들의 모든 행을 출력하시오
[orcl:~]$ grep -i 'salesman' emp.csv
7499,ALLEN ,SALESMAN , 7698,20-FEB-81, 1600, 300, 30
7521,WARD ,SALESMAN , 7698,22-FEB-81, 1250, 500, 30
7654,MARTIN ,SALESMAN , 7698,28-SEP-81, 1250, 1400, 30
7844,TURNER ,SALESMAN , 7698,08-SEP-81, 1500, 0, 30
문제. 부서번호가 10번인 사원들의 이름, 월급을 출력하시오
[orcl:~]$ grep -iw 10 emp.txt
7839 KING PRESIDENT 0 81/11/17 5000 0 10
7782 CLARK MANAGER 7839 81/05/09 2450 0 10
7654 MARTIN SALESMAN 7698 81/09/10 1250 1400 30
7934 MILLER CLERK 7782 82/01/11 1300 0 10
**부서번호 30번도 같이 출력된다. hiredate 의 10 이 검색되서 그렇다.
**아직 배우지 않았지만, awk 를 사용하면 이와 같은 문제를 해결할 수 있다.
[orcl:~]$ awk '$8=='10'{print $2,$8}' emp.txt
KING 10
CLARK 10
MILLER 10
또는
[orcl:~]$ awk '{print $2,$8}' emp.txt | grep -iw '10'
■ 12. awk 명령어
"특정 컬럼을 출력하고자 할 때 사용하는 명령어"
예:
$ awk '패턴{action}' 대상 파일명
※ 리눅스 연산자 3가지
1. 산술 연산자 : +,-,*,/
2. 비교 연산자 : >,<.>=,<=,==,!=
3. 논리 연산자 : &&, ||, !
문제. 월급이 3000 이상인 사원들의 이름, 월급을 출력하시오!
[orcl:~]$ awk '$6>='3000'{print $2,$6}' emp.txt
KING 5000
FORD 3000
SCOTT 3000
**3000을 싱글쿼테이션 안에 함께 넣거나,
3000 에 더블 쿼테이션 넣으면
문자로 인식해서 맨앞자리 숫자인 3보다 큰 숫자가 나온다.(그래서 950도 출력됨)
[orcl:~]$ awk '$6>="3000"{print $2,$6}' emp.txt
KING 5000
JAMES 950
FORD 3000
SMITH 800
SCOTT 3000
문제. 직업이 salesman 이 아닌 사원들의 이름,직업을 출력하시오
[orcl:~]$ awk '$3=!toupper('salesman') {print $2,$6}' emp.txt
KING 5000
BLAKE 2850
CLARK 2450
JONES 2975
MARTIN 1250
ALLEN 1600
TURNER 1500
JAMES 950
WARD 1250
FORD 3000
SMITH 800
SCOTT 3000
ADAMS 1100
MILLER 1300
*toupper 를 쓰면 대문자화 시킨다.
문제. 직업이 salesman 인 사원들의 이름.월급을 출력하는데 월급이 1500 이상인 사원들만 출력하시오
[orcl:~]$ awk '$3==toupper("salesman")&& $6>=1500 {print $2,$6}' emp.txt
ALLEN 1600
TURNER 1500
문제. 이름이 A로 시작하는 사원들의 이름, 월급을 출력하시오
[orcl:~]$ awk '{print $2,$6}' emp.txt | grep -i '^a'
ALLEN 1600
ADAMS 1100
문제. 이름, 직업, 월급을 출력하는데 이름이 A 로 시작하는 사원들을 출력하시오
substr 이용 방법
$
awk 'substr($2,1,1)=="A" {print $2,$6,$3}' emp.txt
문제. 입사일에 81 을 포함하지 않는 사원들의 이름, 입사일을 출력하시오
[orcl:~]$ awk '{print $2,$5}' emp.txt | grep -v '81'
SMITH 80/12/09
SCOTT 82/12/22
ADAMS 83/01/15
MILLER 82/01/11
■ 13. sort 명령어
" data 를 특정 컬럼을 기준으로 정렬하는 명령어"
예제:
$ sort 옵션 파일명
$ sort -k
6 emp.txt
※ 설명: emp.txt 의 모든 데이터를 출력하는데 6번째 컬럼의 데이터가 작은값부터 출력하시오
높은것부터 출력하려면 -rk 쓰면 된다.
문제. 이름.월급을 출력하는데 월급이 높은 것 부터 출력하시오
[orcl:~]$ sort -rk 6 emp.txt | awk '{print $2,$6}'
KING 5000
FORD 3000
SCOTT 3000
JONES 2975
BLAKE 2850
CLARK 2450
ALLEN 1600
TURNER 1500
MILLER 1300
MARTIN 1250
WARD 1250
ADAMS 1100
JAMES 950
SMITH 800
문제. 직업이 salesman 인 사원들의 이름,월급을 출력하는데 월급이 높은 것 부터 출력하시오
[orcl:~]$ sort -rk 6 emp.txt | grep -i 'salesman' | awk '{print $2,$3,$6}'
ALLEN SALESMAN 1600
TURNER SALESMAN 1500
MARTIN SALESMAN 1250
WARD SALESMAN 1250
grep 안쓴거
$ sort
-rk 6 emp.txt | awk '$3==toupper("salesman") {print $2,$3,$6}'
****salesman
에
더블쿼테이션 써줘야 한다.
문제46. 직업이 SALESMAN 인 사원들의 토탈월급을 출력하시오
[orcl:~]$ awk '$3==toupper("salesman")' emp.txt | awk '{sum += $6 }END{print sum}'
5600
문제. 자기 홈 디렉토리에서 ls -lrt 라고 조회한 결과를 분석하시오
$ cd
$ ls -lrt
-rw-r--r-- 1 oracle oinstall 0 12월 24 16:39 emp
-rw-r--r-- 1 oracle oinstall 254 12월 24 16:46 clean.sh
-rw-r--r-- 1 oracle oinstall 0 12월 24 16:51 4
-rw-r--r-- 1 oracle oinstall 726 12월 24 16:57 salgrade.csv
-rw-r--r-- 1 oracle oinstall 380 12월 24 17:46 make_csv.sh
-rw-r--r-- 1 oracle oinstall 111 12월 24 17:48 regions.csv
-rw-r--r-- 1 oracle oinstall 19211 12월 24 17:49 employees.csv
-rw-r--r-- 1 oracle oinstall 1904 12월 24 17:49 departments.csv
-rw-r--r-- 1 oracle oinstall 627 12월 24 17:49 job_history.csv
-rw-r--r-- 1 oracle oinstall 1380 12월 24 17:50 jobs.csv
-rw-r--r-- 1 oracle oinstall 1430 12월 24 17:50 countries.csv
-rw-r--r-- 1 oracle oinstall 247 12월 25 21:45 auto_ex.sh
-rwxrwxrwx 1 oracle oinstall 169 12월 26 10:11 diff.sh
-rwxrwxrwx 1 oracle oinstall 164 12월 26 10:16 find_file.sh
-rwxrwxrwx 1 oracle oinstall 197 12월 26 10:37 find_word.sh
-rw-r--r-- 1 oracle oinstall 2891 12월 26 11:29 locations.csv
-rw-r--r-- 1 oracle oinstall 456 12월 26 11:30 make_csv2.sh
-rw-r--r-- 1 oracle oinstall 229 12월 26 11:54 find_ename.py
-rwxr-x--- 1 oracle oinstall 63851630 12월 27 15:13 hadoop-1.2.1.tar.gz
-rwxr-x--- 1 oracle oinstall 81288181 12월 27 15:13 hive-0.12.0.tar.gz
-rw-r--r-- 1 root root 39 12월 27 15:19 emprm.sh
drwxr-xr-x 10 oracle oinstall 4096 12월 27 17:05 hive-0.12.0
-rw-r--r-- 1 oracle oinstall 84 12월 28 14:47 dept2.csv
-rw-r--r-- 1 oracle oinstall 644 12월 28 14:50 emp2.csv
drwxr-xr-x 2 oracle oinstall 4096 12월 29 19:01 test
drwxr-xr-x 2 oracle oinstall 4096 12월 29 19:52 tmp
-rw-r--r-- 1 oracle oinstall 0 12월 29 20:07 =3000
drwxr-xr-x 5 oracle oinstall 4096 12월 31 09:53 metastore_db
-rw-r--r-- 1 oracle oinstall 3343 12월 31 11:15 derby.log
drwxr-xr-x 4 oracle oinstall 4096 12월 31 11:15 TempStatsStore
-rwxr-x--- 1 oracle oinstall 217775993 12월 31 11:29 tajo-0.11.1.tar.gz
-rwxr-x--- 1 oracle oinstall 2987 12월 31 16:12 emp8.csv
-rw-r--r-- 1 oracle oinstall 47 12월 31 16:28 tajologin.sh
-rw-r--r-- 1 oracle oinstall 918 12월 31 16:54 total.sh
-rw-r--r-- 1 oracle oinstall 75712 1월 2 12:05 pig_1546392930689.log
-rw-r--r-- 1 oracle oinstall 32733 1월 2 14:02 pig_1546398413678.log
-rw-r--r-- 1 oracle oinstall 8259 1월 2 14:16 pig_1546405373157.log
아래로 내려올 수록 최근 날짜의 작업물이 출력되는 것을 볼 수 있다.
※설명:
-l : 리스트
-r : reverse
-t : 시간
※파일을 리스트를 보여주는데, 과거부터 보여달라!
-rw-r--r-- 1 oracle oinstall 8259 1월 2 14:16 pig_1546405373157.log
↑ ↑ ↑ ↑ ↑ ↑
권한 링크 소유자 그룹 파일크기 최종변경시간
문제. ls -lrt *.txt 를 했을 때 파일크기에 해당하는 부분만 출력하시오
[orcl:~]$ ls -lrt *.txt | awk '{print $5}'
1467
0
0
0
0
0
0
■ 14. uniq 명령
"중복된 라인을 제거하는 명령어"
예:
$uniq 옵션 파일명
문제. 직업을 정렬, 중복제거 해서 출력하시오
[orcl:~]$ awk '{print $3}' emp.txt | sort | uniq
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
문제. emp.txt 에 같은 row가 하나 더 입력된 emp2.txt 를 생성하고, emp2.txt 의 중복라인을 출력하시오
[orcl:~]$ sort emp2.txt | uniq -d
7934 MILLER CLERK 7782 82/01/11 1300 0 10
■ 15. echo 명령어
"출력하고자 하는 글자를 출력할 때 사용하는 명령어"
예제:
$ echo '야호~'
문제. 직업을 물어보게하고 직업을 입력하면 해당 직업을 갖는 사원들의
이름과 직업이 출력되게 하시오
※ 스크립트 설명
[orcl:~]$ vi job2.sh
#!/bin/bash ****리눅스 스크립트 중에서 bash shell 스크립트를 사용하겠다
echo " " #정돈 된 echo 를 보여주기 위한 추가장치다
echo -n "직업을 입력하세요~"
read job
echo " "
grep -i $job emp.txt | awk '{print $2,$3}'
~
~
[orcl:~]$ sh job2.sh
직업을 입력하세요~salesman
MARTIN SALESMAN
ALLEN SALESMAN
TURNER SALESMAN
WARD SALESMAN
문제. 부서번호를 물어보게하고 부서번호를 입력하면
해당 부서번호에서 근무하는 사원들의 이름,월급,부서번호가 출력되게 하시오
[orcl:~]$ vi deptno2.sh
#!/bin/bash
echo " "
echo -n "부서번호를 입력하세요~"
read deptno
echo " "
awk '{print $2,$8,$6}' emp.txt | grep -iw $deptno
~
[orcl:~]$ sh deptno2.sh
부서번호를 입력하세요~10
KING 10 5000
CLARK 10 2450
MILLER 10 1300
다른 코드
#!/bin/bash
echo
" "
echo -n "부서번호를 입력하세요~ "
read deptno
echo
" "
awk '$8=='$deptno' {print $2,$6,$8}' emp.txt
***$8== 을 싱글쿼테이션으로 감싸줌
원래 awk '$8=="SALESMAN"
{print.....}' 이렇게 써줬는데
위 코드에서는 싱글쿼테이션을 붙여주면 $deptno 가 문자화 되서
안 붙인다.