간단한 셸 명령이라도 조합하는 방식에 따라 강력한 무기가 될 수 있다. 이 책은 160개 원라이너(한 줄짜리 명령) 문제를 통해 독자가 기본적인 셸 문법과 기능을 익히고 대량의 텍스트/JSON/CSV/바이너리 데이터를 조작하는 방법을 배울 수 있게 했다. 데이터를 가공하고 처리하는 데 필요한 OS, 정규표현식, 유니코드, 이미지/날짜/시간 데이터, 통신 프로토콜 지식도 살펴본다. 문제를 반복해서 풀고 명령을 조합하는 법을 훈련함으로써, 실무 문제를 직접 해결할 사고력을 기를 수 있다
Contents
옮긴이 머리말 xiii
베타리더 후기 xv
지은이 소개 xviii
이 책에 대하여 xx
감사의 글 xxv
PART I 셸과 명령어에 익숙해지기
CHAPTER 1 리눅스 환경
1-1 환경 준비하기 3
1-2 터미널, 셸, 명령어, 파일의 관계 알아보기 4
__연습 001 터미널 사용 5
__연습 002 명령어 중단 7
__연습 003 계산(1 + 1) 8
__연습 004 파일에 저장 10
__연습 005 파일과 디렉터리 조작 12
__연습 006 파일 권한 16
__연습 007 명령어 조사 19
1-3 자주 사용하는 명령어 알아보기 21
__연습 008 sed를 사용한 치환 21
__연습 009 grep을 사용한 검색 23
__연습 010 grep을 사용한 검색과 추출 25
__연습 011 awk를 사용한 검색과 계산 26
__연습 012 sort와 uniq를 사용한 집계 30
__연습 013 xargs를 사용한 일괄 처리 34
__연습 014 bash를 사용한 메타 프로그래밍 36
1-4 파일 조작하기 38
__연습 015 깃허브에서 저장소 클론 39
__실전 001 파일명 검색 40
__실전 002 이미지 파일 일괄 변환 42
__실전 003 파일명 일괄 변경 45
__실전 004 특정 파일 삭제 49
1-5 awk와 sed에 익숙해지기 51
__실전 005 설정 파일에서 정보 추출 51
__실전 006 터미널에 모양 출력 52
__실전 007 소비세 계산 55
__실전 008 로그 집계 57
__실전 009 로그 추출 60
__실전 010 제목 표기법 변환 62
__실전 011 회의록 정리 63
CHAPTER 2 셸 기초
2-1 변수와 제어 구문, 명령어 입출력 조작 파악하기 68
__연습 016 표준 입출력 및 표준 에러 출력 68
__연습 017 셸과 변수 70
__연습 018 문자열 연결과 치환 71
__연습 019 변수를 사용한 계산 73
__연습 020 따옴표와 변수 74
__연습 021 배시의 배열과 연관 배열 77
__연습 022 반복과 종료 상태 80
__연습 023 조건 분기 83
__실전 012 변수 읽기 86
__실전 013 존재하지 않는 파일의 초기화 89
__실전 014 다양한 루프 90
__실전 015 문자 유형 변환 92
2-2 프로세스를 고려해 셸 조작하기 94
__연습 024 프로세스의 이해 95
__연습 025 프로세스의 부모 자녀 관계 97
__연습 026 내부 명령어와 외부 명령어 99
__연습 027 서브셸 사용 101
__연습 028 명령어 치환과 프로세스 치환 102
__실전 016 변수 로컬화 104
__실전 017 명령어를 사용할 수 없을 때의 복사 107
__실전 018 셸 내부 명령어만 사용한 집계 108
__실전 019 셸 기능을 기용한 파일 덮어쓰기 111
2-3 중괄호 확장과 파일 글롭 113
__연습 029 중괄호 확장 113
__연습 030 와일드카드와 파일 글롭 114
__실전 020 셸 기능으로 ls 출력 116
__실전 021 조건이 까다로운 파일 목록 작성 118
__실전 022 더미 FQDN 생성 120
2-4 시그널 이해하고 다루기 122
__연습 031 시그널 조작 122
__연습 032 시그널의 종류 123
__실전 023 다른 셸에 시그널 전송 126
__실전 024 exit 시 파일 삭제 128
__실전 025 pipefail 시의 문제 129
__실전 026 18시가 지나면 퇴근하기 131
2-5 셸 명령어를 사용할 때 이상한 작동이나 기능 다루기 133
__실전 027 인수를 바꿔 명령어 재실행 134
__실전 028 이상한 이름의 디렉터리 다루기 136
__실전 029 셸 스크립트의 에러 체크 137
__실전 030 앞쪽이 일치하는 변수명 140
PART II 사고 능력 갈고닦기
CHAPTER 3 문장과 문자
3-1 놀면서 텍스트 다루는 법 익히기 145
__연습 033 펄, 루비 원라이너 145
__연습 034 파이썬 원라이너 149
__연습 035 정규표현식의 종류 152
__연습 036 펄을 사용한 치환 155
__실전 031 대문자로 변환 157
__실전 032 회문 검출 159
__실전 033 회문 여부 판정 161
__실전 034 한자 뒤에 독음 추가 164
__실전 035 7문자 이상의 영대문자 사용 방지 165
__실전 036 괄호 쌍 체크 168
3-2 문장을 조사하고 가공하기 170
__연습 037 줄바꿈 검색과 치환 170
__연습 038 히라가나와 가타카나 변환 172
__연습 039 한자의 독음 변환과 영어로의 번역 174
__연습 040 포맷 변환 176
__실전 037 복사 & 붙여넣기 실수 찾기 177
__실전 038 복잡하게 얽힌 문자 엔티티 참조 179
__실전 039 문장 줄바꿈 181
__실전 040 기타 변환 184
__실전 041 주석 확인 186
__실전 042 순서가 있는 목록 형태 정리 189
__실전 043 문헌 목록 정렬 191
__실전 044 줄바꿈 검색 194
__실전 045 여러 행에 걸친 중복 검색 195
__실전 046 한자 독음 붙이기 198
CHAPTER 4 데이터 관리, 집계, 변환
4-1 테이블 형식 데이터 다루기 201
__연습 041 테이블 201
__연습 042 데이터 연결 206
__실전 047 전월 비교 데이터 추가 209
__실전 048 CPU 부하 조사 1 211
__실전 049 CPU 부하 조사 2 212
__실전 050 매출 집계 214
__실전 051 시험 점수 목록 출력 217
__실전 052 집계 형식 변환 219
__실전 053 결측값 보완 221
4-2 까다로운 포맷의 데이터 다루기 223
__연습 043 JSON과 jq 223
__연습 044 이스케이프 문자가 포함된 CSV 취급 228
__실전 054 JSON 파일로부터의 추출 230
__실전 055 JSON 로그 비교 233
__실전 056 비정규 데이터끼리의 결합 236
__실전 057 테이블 레이아웃 형태 정리 241
__실전 058 CSV 파일의 숫자 집계 243
__실전 059 CSV 파일의 열 개수 조사 246
4-3 날짜와 시간 다루기 248
__연습 045 날짜와 시간 계산하기 249
__실전 060 프리미엄 프라이데이 251
__실전 061 지난 주 파일 253
__실전 062 날짜에 법정 공휴일 추가 255
__실전 063 5주차 포함 월 확인 258
__실전 064 세 번째 화요일 나열 261
__실전 065 월별 휴일 수 263
__실전 066 일정 조정 266
__실전 067 요일별 분할 268
__실전 068 유닉스 시각의 한계 270
__실전 069 윤초 272
CHAPTER 5 문자 코드와 바이너리
5-1 문자 코드에 친숙해지기 275
__연습 046 n진수 276
__연습 047 아스키코드 279
__연습 048 유니코드와 UTF-8 281
__연습 049 문자 코드 변환 284
__실전 070 엑셀 워크시트 285
__실전 071 문자의 바이트 수 조사 287
__실전 072 이모지 289
__실전 073 압축을 푼 뒤 문자가 깨진 파일명 수정 290
__실전 074 연호 표기 292
__실전 075 아스키 문자 삭제 294
__실전 076 macOS에서 생성한 파일 목록 294
__실전 077 서로 다른 문자 코드의 파일 일괄 검색 296
__실전 078 교육용 기초 한자가 아닌 한자 검출 297
__실전 079 문자 코드 특정 299
5-2 바이너리 다루기 302
__연습 050 문자열 바이너리 해석과 바이트 순서 302
__연습 051 바이너리 파일 조사용 명령어 305
__실전 080 2진수에서 문자열 복원 308
__실전 081 BOM 식별 310
__실전 082 이미지 분할 312
__실전 083 Shift_JIS를 그대로 echo하는 셸 스크립트 315
__실전 084 줄바꿈 코드 식별과 집계 317
__실전 085 문자의 바이너리 평균 검출 320
__실전 086 분수 계산 322
__실전 087 od 출력 복원 325
__실전 088 디지털 워터마킹 해독 327
__실전 089 CTF 331
CHAPTER 6 퍼즐
6-1 수학으로 놀아보기 335
__연습 052 정확한 계산 335
__연습 053 소수 337
__연습 054 조합 생성 338
__실전 090 n진수 계산 340
__실전 091 조합 추출 341
__실전 092 지수 계산 342
__실전 093 처음 소수가 되는 시각(연월일시분초) 344
__실전 094 라그랑주 네 제곱수 정리의 부분적 검증 347
__실전 095 그레이 코드 349
6-2 각종 문제 정리하기 352
__실전 096 일정 조율 352
__실전 097 세로 읽기 문자열 검출 354
__실전 098 레코드 분리 357
__실전 099 포커 패 검출 359
__실전 100 끝말잇기 순으로 배열 362
__실전 101 연속하는 알파벳 검출과 약어 표기 364
__실전 102 콰인 367
PART III 응용하기
CHAPTER 7 리눅스 환경 조사, 설정 및 활용
7-1 파일과 디렉터리 조사 및 조작하기 373
__연습 055 각종 파일의 저장 위치 374
__연습 056 파일 시스템 377
__연습 057 아이노드 379
__실전 103 ls -l 출력의 2번째 열 380
__실전 104 파일명의 길이의 한계? 382
__실전 105 디스크 사용량 집계 384
__실전 106 특수 권한 386
__실전 107 root가 된 횟수 집계 388
__실전 108 문제를 일으킨 프로세스 해석 391
__실전 109 내용이 같은 파일 검색 394
__실전 110 여러 디렉터리의 파일 수 세기 396
7-2 의사 파일 시스템 사용하기 398
__연습 058 의사 파일 시스템 398
__연습 059 프로세스 치환과 파일 401
__실전 111 평균 부하 조사 402
__실전 112 날짜 얻기 404
__실전 113 현재 디렉터리 조사 406
__실전 114 공유 라이브러리 검색 408
__실전 115 USB 메모리 언마운트 411
__실전 116 디바이스 번호 조사하기 413
__실전 117 USB 연결 및 분리 감시 416
__실전 118 프로세스가 열어둔 파일 조사 418
__실전 119 메모리 맵 표시 419
__실전 120 수수께끼 데이터 조사 422
7-3 시스템 콜 추적하기 425
__연습 060 strace 사용하기 425
__실전 121 파일 경로 추출 427
__실전 122 사용한 프로세스 수 세기 429
__실전 123 계산 시간 해석 433
7-4 각종 조사와 설정 정리하기 436
__실전 124 네트워크 디바이스 목록 437
__실전 125 IP 주소 추가 438
__실전 126 배시 버전 변수 439
__실전 127 터미널 에뮬레이터의 윈도우 크기 441
__실전 128 환경에 따른 grep의 작동 차이 443
__실전 129 실행 파일로부터 문자열 추출 445
7-5 원라이너로 서비스 조작하기 447
__실전 130 인스턴트 웹 서버 447
__실전 131 메일 통지 보내기 451
__실전 132 로그 모니터링 & 알림 453
__실전 133 시스템을 자동으로 종료하기 454
CHAPTER 8 소프트웨어 개발에 자주 등장하는 원라이너
8-1 소스 코드와 스크립트 조사 및 형태 정리하기 457
__실전 134 파이썬의 들여쓰기 확인 458
__실전 135 리스프의 괄호 정합성 확인하기 459
__실전 136 함수의 위치 교체 462
__실전 137 코드 형태 정리 464
8-2 데이터 생성하기 467
__연습 061 더미 데이터 생성 467
__실전 138 테스트 케이스 작성 469
__실전 139 URL 나열 471
__실전 140 웹사이트 구조로부터 액세스 로그 생성 473
__실전 141 테이블 정보로부터 더미 데이터 생성 476
__실전 142 비트스쿼팅 479
8-3 깃 저장소 조사 및 조작하기 481
__연습 062 저장소 준비 482
__연습 063 변경된 파일 확인 485
__연습 064 커밋 완료 정보를 활용 487
__연습 065 브랜치와 병합 491
__실전 143 조건에 맞는 파일만 커밋 496
__실전 144 조건에 맞는 파일만 원래대로 되돌리기 497
__실전 145 커밋 빈도 조사 500
__실전 146 오랫동안 병합되지 않은 브랜치 조사 502
CHAPTER 9 인터넷과 통신
9-1 인터넷에서 정보 얻기 505
__연습 066 HTML 문장 처리 505
__실전 147 단어 출현 빈도 508
__실전 148 지하철역 목록 작성 510
__실전 149 일기예보 출력 512
__실전 150 온라인 서점 정보 스크레이핑 514
__실전 151 여러 사이트의 정보 연계 517
9-2 통신 관련 조사 및 조작 수행하기 520
__연습 067 이름 결정 520
__연습 068 HTTP 상태 코드 523
__실전 152 네트워크 모니터링 525
__실전 153 telnet 명령어로 HTTP 통신 526
__실전 154 /etc/hosts 사용 조사 529
__실전 155 부정확한 Content-Length 531
__실전 156 여러 IP 주소가 등록된 도메인 533
__실전 157 ping의 패킷 해석 534
__실전 158 패킷을 사용한 OS 추정 537
__실전 159 여러 도메인 조사 539
__실전 160 SSL 인증서 조사 542
참고 문헌 546
찾아보기 547
Author
우에다 류이치,야마다 야스히로,다시로 가쓰야,나카무라 소이치,이마이즈미 미쓰유키,김모세
‘셸 예능’이라는 용어를 만든 장본인. 본업은 프로그래밍이 특기(자칭)인 로봇 공학 연구자다. 모 국립 대학의 교직원이자 로봇 축구 경기자였지만, 현장 경험이 없으면 프로그래밍을 논할 수 없다고 판단해 연구를 중단하고 로봇과는 전혀 관계없는 기업 시스템을 만드는 기업에서 4년 반 동안 근무했다. 현재는 지바 공업대학의 준교수다. 기업에서 근무할 때부터 집필 활동을 시작해 셸 예능과 본업 양쪽에서 다수의 책을 썼다. 깃허브(https://github.com/ryuichiueda)에 직접 만든 셸이나 배시 CMS, 원라이너용 파이썬 래퍼인 opy, 기타 로봇용 프로그램을 공개하고 있다.
‘셸 예능’이라는 용어를 만든 장본인. 본업은 프로그래밍이 특기(자칭)인 로봇 공학 연구자다. 모 국립 대학의 교직원이자 로봇 축구 경기자였지만, 현장 경험이 없으면 프로그래밍을 논할 수 없다고 판단해 연구를 중단하고 로봇과는 전혀 관계없는 기업 시스템을 만드는 기업에서 4년 반 동안 근무했다. 현재는 지바 공업대학의 준교수다. 기업에서 근무할 때부터 집필 활동을 시작해 셸 예능과 본업 양쪽에서 다수의 책을 썼다. 깃허브(https://github.com/ryuichiueda)에 직접 만든 셸이나 배시 CMS, 원라이너용 파이썬 래퍼인 opy, 기타 로봇용 프로그램을 공개하고 있다.