본문 바로가기

linux

리눅스 기본 명령어2[wc,grep,awk,sort,uniq,echo]

728x90
반응형

기본명령어 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'
KING 10
CLARK 10
MILLER 10

***awk txt 파일만 가능하다




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 문자화 되서

붙인다.

 

 


728x90
반응형