쉘 제어문
-if문
if [ 조건 ] ; then 조건이 참일 때 실행할 명령
elif [ 다른 조건 ] ; then 조건이 참일 때 실행할 명령
else
ex(1) myPocket 금액에 따라 교통수단 출력
-for문
for 변수 in 항목들; do
반복할 명령
done
ex(1) "hello world" 100번 출력
ex(2) 1부터 100까지 출력(변수 사용)
<실습 1>
if문을 사용하여 first.txt가 존재하면 exist 출력 없으면 does not exist 출력
FILE = first.txt처럼 변수 대입 시 = 양쪽에 공백(" ")있으면 no such file or directory 뜸
조건문 양 끝에 공백(" ") 넣어야 정상 작동함
<실습 2>
hello world1 hello world2 ... hello world100까지 hello world+숫자 100번 출력
<실습 3>
for문을 이용하여 hello world 1, hello world 2, ... 100까지 문구가 적힌 파일 생성
단, 여러 번 돌려도 hello world 1, hello world 2, ... 100이 한 세트만 존재해야 함 -> if문 사용
<실습 4>
file1~file100까지 100개의 파일을 만들고, 해당 파일마다 hello world from file1, ... 추가
file1 내용 : hello world from file1
file2 내용 : hello world from file2
<실습 5>
폴더 안에서 파일, 디렉토리, 그외 파일들 개수를 각각 세기
Linux 변수 증가 : ((변수++))
주요 쉘 명령어
1. grep : 파일 내에서 특정 패턴이나 문자열을 검색
grep[옵션][찾고자 하는 문자열][파일명]
-r 옵션 : 디렉토리 내 모든파일에서 검색
-i 옵션 : 대소문자 구분 없이 검색
-n 옵션 : 라인수 출력
ex) grep -rin "hello" mydir
hello문자열을 라인수와 함께 mydir폴더에서 대소문자 구분없이 검색
-r옵션으로 인해 mydir안에 있는 모든 디렉토리를 들어가서 찾음
상당히 많이 활용됨
회사 입사 후 핵심키워드를 넣어 회사 서비스 소스코드를 조회할 때 유용하게 사용할 수 있음
aaa폴더에 서비스 소스코드 -> grep -rin "test_database" aaa
==========> 옛날 스타일이긴 함ㅋㅋ. 요즘은 CI/CD
<실습>
디렉토리 구조
home/mydir/first.txt -> hello world
home/mydir/second.txt -> world
home/mydir/test_folder/abc.txt -> HellO world
현재 위치에서 실행하고 싶을 때 .을 많이 이용함
2. find : 파일이나 디렉토리를 검색하여 위치 출력
보통 grep과 같이 자주 씀
find를 통해서 .java로 끝나는 파일목록 listing 후, 추려진 파일들에서 grep ==> 속도 UP !
find [경로][옵션][행동]
-name 옵션 : 파일명으로 검색
-type 옵션 : 타입으로 검색(f는 파일, d는 디렉토리 등)
-exec, \, {}
exec : find로 찾은 결과에 대해 실행명령
\ : exec의 종료지점을 의미
{} : find로 찾은 대상이 담기는 공간을 의미
find . -type f -name "*.txt" : 현재 폴더에서 파일타입 중 .txt로 끝나는 파일명 검색
⭐ find . -name "*.파일형식" | xargs grep -rin "문자열"
|(파이프라인)을 통해 그 다음 명령어로 전달
xargs는 입력받은 파일을 한줄씩 읽는 것을 의미
⭐ find . -name "*.txt" -exec 명령어 {} 복사대상폴더 \;
exec {} \는 한 세트의 문법
find로 찾은 파일에 대해 echo명령어 실행
find . -name "*.txt" -exec grep -rin "hello" {} \;
cd mydir
mkdir testFolder
find . -name "*.txt" -exec cp -r {} testFolder \;
3. 사용자와 그룹
리눅스에서 super 권한이 있는 root 계정과 그외 계정으로 사용자는 구성 (우리도 그외 계정임)
su - : root계정으로 전환 -> root 계정의 비밀번호
sudo : root계정의 권한 빌려오는 것 -> 현재 계정의 비밀번호
apt-get : 데비안 계열
yum : redhat, centos
-목록과 버전을 최신화시키기 위해 다음 명령어 수행
sudo apt-get update : 설치 되어있는 패키지들의 새로운 버전이 있는지 확인하는 명령어
sudo apt-get upgrade : 패키지들의 최신 버전에 따라서 패키지들의 버전을 업그레이드 해주는 명령어
-git 설치 및 설치 확인
sudo apt-get install git
git --version
-계정 목록조회
cat /etc/passwd
-계정 삭제
sudo userdel newuser1
sudo userdel -r newuser1 유저 디렉토리까지 삭제
<실습>
(1) sudo useradd -g shinyujeong -d /home/newuser1 newuser1
새로운 유저를 만들면서 같은 그룹지정 및 홈 디렉토리 지정
(2) exit
원래 계정으로 복귀
(3) mkdir /home/newuser1
새로운 유저의 디렉토리 생성
(4) sudo passwd newuser1
신규유저 패스워드 지정
(5) sudo su newuser1
신규유저로 계정 전환
(6) cd 명령어 후 pwd 명령어 치면 신규유저로 잘 전환이 된 것을 확인 가능
(7) exit
(8) cd
touch test.txt
echo "hello world" > test.txt
홈 디렉토리에 test.txt생성 후 "hello world"입력
(8) chmod 510 test.txt
<파일 권한 변경 - 숫자 표기법>
4(r)2(w)1(x) 권한으로 구성
chmod 510 test.txt
(9) 테스트
소유자한테 읽기, 실행 권한, 그룹한테는 실행권한, others 아무런 권한X
newuser1는 읽기 권한이 없기 때문에 Permission denied 에러 발생
chmod 550 test.txt로 변경
newuser1는 읽기 권한이 생겼기 때문에 txt파일 읽기 가능
(10) 사용자 삭제
sudo rm -rf newuser1/
<파일 권한 변경 - 기호적 표기법>
chmod u+x test.txt : 소유자에게 실행 권한 추가
chmod g-w test.txt : 그룹의 쓰기 권한 제거
chmod o=r test.txt : 다른 사용자의 권한을 읽기만 가능하게 설정
Q. 유저에 w권한 더하고, 그룹에 x권한 빼고, 다른 사용자에 r권한만 설정하기
유저 : r-x
그룹 : r-x
다른 사용자 : ---
A. chmod u+x test.txt
chmod g-w test.txt
chmod o=r test.txt
유저 : rwx
그룹 : r--
다른 사용자 : r--
- 소유자 변경
sudo useradd -g shinyujeong newuser1
sudo chown newuser1:shinyujeong test.txt
4. 프로세스
운영체제가 수행하고 있는 작업의 목록
-NGINX 웹서버 실습
sudo apt-get install nginx
sudo systemctl start nginx
ps -e
프로세스 목록에 nginx 생김
sudo systemctl stop nginx
**추가
서버 앞 단에서 라우팅 역할을 하는 nginx가 죽는 상황이 의심된다면 (옛날 서비스) grep으로 동작 확인
ps -e | grep -i "nginx"
-e : 모든 프로세스
-f : 사용자, PID 등 부가 정보까지 출력
프로세스 지우기
- 기존 삭제 방법 권장
- kill -9 PID는 사용 지양
- nginx가 들어간 것들 찾아서 일일이 삭제
5. 네트워크
sudo apt install net-tools
(1) ifconfig : 네트워크 설정정보 출력
(2) ping [hostname/IP] : 네트워크 연결상태 확인
(3) nc -zv 또는 telnet : 특정 port까지 열려있는지 확인 -> 내가 개발하는 서버가 정상인지 확인할 때 사용
nc는 넷켓
ex) nc -zv naver.com 443
(4) netstat : 현재 서버에 연결된 네트워크 정보 출력
넷켓 VS netstat
넷켓 : 내 컴퓨터에서 서버가 동작하는지 확인 -> 내가 날림
netstat : 현재 나한테 연결된 제3자가 누군지 회사 서버로부터 응답 기대 -> 서버가 날림
(5) ssh(Secure Shell Protocol): 원격 호스트와의 터미널 세션을 제공 ex) ssh [username]@[hostname/IP]
(6) scp(Source Copy) : 파일 전송 ex) scp [source][destination]
6. vi 에디터
UNIX 기반 시스템에서 가장 오래된 텍스트 에디터 중 하나
-명령모드 : 텍스트를 편집하는 대신에 커서를 이동하거나 텍스트를 삭제/복사/붙여넣기 하는 등의 명령을 수행
-입력모드 : 텍스트를 입력하거나 수정
파일 열기
vi 파일명
nano VS vi
nano는 문자열 인코딩 방식 지원에 한계가 있어 utf-8 파일이 깨질 때가 많음
[주요 명령어]
-입력모드
i : 현재 커서부터 입력
a : 다음 커서부터 입력
o : 다음줄 커서부터 입력
x : 현재 커서가 위치한 단어 삭제
dd : 현재 커서가 위치한 행 삭제
yy : 현재 커서가 위치한 행 복사
p : 현재 행 이후에 붙여넣기
-명령모드
esc
:w 파일저장
:q 저장없이 vi 종료
:wq 저장 후 vi 종료
gg : 파일의 첫 줄로 이동
Shift + G : 파일의 마지막 줄로 이동
Ctrl + f : 한 페이지 아래로 이동
Ctrl + b : 한 페이지 위로 이동
/ : 검색하기
회사에서 사고 안칠려면 :q!로 탈출하기
<실습> ESC 열심히 누르면서 하기 ㅋㅋ
최초 abc.txt파일 생성후 첫줄에 아래 내용 입력
Welcomee to java world
저장 후 나가기
두번째 라인부터 hello world 5줄 입력hello world 뒤에 1, 2, 3, 4, 5 숫자 붙인 후 저장 후 나가기
'Back-End 공부 > Linux' 카테고리의 다른 글
[Linux] 개발 환경 설치 및 리눅스 명령어 학습 (1) | 2023.11.14 |
---|