linux基础讲解

1. kernel + shell 及系统启动


* boot 到kernel初始化

CPU 0 init -> 其余CPU、内存 、驱动

  • kernel到user space 0、1进程 init: sysv systemd
  • kernel功能 硬件驱动 内存管理 进程管理与调度 网络子系统 …

  • 目录结构
    /boot /proc /net /sys /etc /tmp /dev /bin /lib /include …
    启动 进程信息 网络 系统信息 系统配置 临时 设备 二进制程序 库 头文件 …

  • shell提供功能
    部分builtin命令
    ​ 基于命令行的进程调用
    ​ 流程控制
    ​ 命令组合及IPC组合

2. 文件、目录、磁盘、内存

  • 大致范围: ls echo ln rm cp touch mkdir cat head more wc pwd readlink fdisk mount umount df du free

 
  1. ls #列出当前目录的显示文件或目录
  2. ls -al # 列出当前文件夹所有文件或文件夹,以详细信息显示
  3. ls -alsh #
  4. ls -a -l -s -h #同上
  5. echo "user name is $USER"
  6. touch note.txt #新建空文件note.txt
  7. mkdir dir #新建目录dir
  8. cat /etc/passwd #查看
  9. tac /etc/passwd #倒序查看
  10. head -n 5 /etc/passwd #产看前5行
  11. tail -n 2 /etc/passwd
  12. more /etc/passwd #
  13. wc -l /etc/passwd #统计行数
  14. cp -rf dir1 dir2 file1 file2 targetDir/ #将dir1 dir2 file1 file2都复制到targetDir内
  15. cp -a dir1 dir2 #保留权限信息拷贝
  16. rm -rf note.txt dir #将note.txt和dir都删除
  17. ln -sf filename linkname #新建软链接
  18. readlink -f path #获取path的全路径
  19. pwd #查看当前路径
  20. df -h #以易读方式显示磁盘使用情况
  21. du -sh dir #以易读方式显示dir目录占空间大小
  22. free -h #以易读方式显示内存使用情况
  23. tar cf file.tar file
  24. tar czf file.tar.gz file
  25. tar czf file.tgz file
  26. tar tf file.tar #不解压查看
  27. tar xf file.tar #解压

3. 用户、组、权限

  • 大致范围: who chown chmod usermod

 
  1. # 111 111 111
  2. # u g o a # u: user g: group o: other a: all
  3. # usr grp other
  4. chown -R usrname:groupname dir #修改dir的属主和属组
  5. chmod 751 -R dir #修改权限为751
  6. chmod +x filename #增加执行权限
  7. chmod u-w -R dir #用户去除写权限

4. 变量、环境变量、系统配置

  • 大致范围: env export unset /etc

 
  1. export VAR1=VALUE1 #设置环境变量
  2. unset VAR1 #删除环境变量
  3. cat note.txt | envsubst # 替换文本中所有环境变量

5. 文本编辑器


- 大致范围: vim

- 模式


 
  1. normal、 insert、 visual 、 command
  2. esc i s a c o v ctrl+v :
  • 打开文件

 
  1. vim file1 file2 ... #以多个buffer打开文件粗体
  2. vim -o file1 file2 ... #以多个行打开 ctl+w切换
  3. vim -O file1 file2 ... #以多列打开 ctl+w切换
  4. # normal模式下 :bn :bp #切换下个buffer,上个buffer
  5. vim -p file1 file2 ... #以多个tab打开
  6. # normal模式下 :tabNext :tabPr

- 退出


 
  1. :q
  2. :qa
  3. :wq
  4. :wqa
  • 移动

 
  1. # normal模式下
  2. hjkl #上下左右
  3. w #下个单词
  4. f #跳到字符处
  5. gg G #第一行、最后一行
  6. ctl+n ctl+p #上一行 下一行
  7. ctl+u ctl+d #上半页 下半页
  8. ctl+[ ctl+] #上一段 下一段
  • 编辑

 
  1. i I #normal -> insert ,光标字符前、行首
  2. a A #normal -> insert , 光标字符后、行尾
  3. o O #normal -> insert , 下一行、上一行
  4. r #normal模式下替换
  5. u U #normal模式下将选的的内容切换大小写
  6. dd #删除
  7. 3dd
  8. u ctl+r #回退、前进
  • 搜索 / n N
  • 选择

 
  1. v #normal -> visual ,移动光标选择改变
  2. ctl+v #normal -> visual ,垂直选择
  • vim 组合键规律

 
  1. 数动动 动动:
  2. 4dd #删除当前到下面4行
  3. dd 1dd #删除当前行
  4. 3yy #复制当前到下面3行
  5. yy 1yy #复制当前行
  6. 动介名、动数名:
  7. vip vf" df) #选择当前文段、选择至下个"字符、删除至下个)字符
  8. yiw yi" yi} yi]
  9. d3w
  10. diw di} df" #删除当前单词、删除当前{}内的内容、删除到"字符
  11. 大小写方向反转:
  12. p #粘贴到下一行
  13. P #粘贴到上一行

6. 文件路径查找:

  • 大致范围: which locate find grep
  • 基于路径

 
  1. which vim #which用于查找命令执行文件所在路径
  2. find dir -name *.txt #查找所有txt文件
  3. find . -name *lck -exec rm {} ;
  4. find . -name *lck | xargs rm
  5. rm `find . -name *lck`
  • 基于内容

 
  1. grep root -Rl /etc # /etc目录下查找包含root的文件

7. 内容查找与处理

  • 大致范围: grep awk sed

  • 单行查找


 
  1. grep ^root /etc/passwd #查找包含root开头的行
  2.  
  3. awk '/^root/' /etc/passwd #查找包含root开头的行
  4. awk -F ":" '/^root/{print $(NF)}' /etc/passwd #查找包含root开头的行,分节符为:,获取最后一列
  5.  
  6. sed -n '/^root/p' /etc/passwd #查找包含root开头的行
  7. sed -n '/^root/s/.*:(.*)$/1/p' /etc/passwd #查找包含root开头的行,获取最后一个:以后的内容
  • 范围查找 *跟多高级操作请看第五章

 
  1. awk '{if( NR >= 1 && NR <=3) {print}}' /etc/passwd #打印1至3行
  2. awk '{if( NR < 1 || NR >3) {print}}' /etc/passwd #打印非1至3行
  3. awk '/^root/,/^adm/' /etc/passwd #查找用户为root到adm的行
  4.  
  5.  
  6. sed -n '1,3p' /etc/passwd #打印1至3行
  7. sed '1,3d' /etc/passwd #打印非1至3行
  8.  
  9. sed -n '/^root/,/^adm/p' /etc/passwd #查找用户为root到adm的行
  • 内容截取

8. 字符串处理、字符串格式化、统计


 
  1. sed awk cut printf wc sort

 
  1. awk -F ":" '/^root/,/^adm/{print $(NF)}' /etc/passwd #查找用户为root到adm的行,分节符为:,获取最后一列
  2. sed -n '/^root/,/^adm/s/.*:(.*)$/1/p' /etc/passwd #查找用户为root到adm的行,获取最后一个:以后的内容
  3. cut -d: -f1,4- /etc/passwd #以:为分隔符,获取第一列,第四列到最后一列
  4. printf "%I cost 010.5f" 3.5 #格式化打印
  5. wc -l /etc/passwd #统计行数
  6. seq 1 10 | sort -n -r #seq生成1~10,sort进行反序
  7. awk -F ":" 'BEGIN{nbash=0} {if ($NF == "/bin/bash") {nbash ++}} END{print nbash}' /etc/passwd #统计/etc/passwd 中bash数量
  8. cat /etc/passwd | grep /bin/bash | wc -l #同上

9. 特殊文件描述符,特殊设备


 
  1. /dev/fd /dev/stdin /dev/stdout /dev/stderr /dev/null /dev/random /dev/zero

二. 进程

1. 进程调用、动态库依赖、pid、参数、返回值


 
  1. ./bin/command #路径调用,绝对路径相对路径都可以
  2. command #command在PATH搜索路径中
  3. ldd command #查找command依赖的库
  4. echo $$ #当前shell pid
  5. ls -a -l -s -h #命令参数
  6. echo $? #上个命令的返回值

2. 进程信息查找

  • 范围 ps kill /proc

 
  1. ps -ef
  2. ps -aux
  3. ps -ef | grep yangll | grep vim #查找属于yangll的vim进程信息
  4. kill -9 341324 #

3. 进程的input、stdout、stderr,管道与多命令组合、管道参数重组

  • 范围 | xargs

 
  1. cat /etc/passwd | grep ^root | cut -d: -f1-3
  2. seq 0 100 | xargs -n 2
  3. seq 0 100 | xargs -n 2 echo numbers
  4. seq 0 100 | xargs -n 3 -I % echo numbers %
  5. bash-4.2$ seq 0 0.123 10 | xargs -n 1 -P 10 -I @ bash -c '''
  6. dir=./topdir/$(printf "%010.5f" @)
  7. echo dir=$dir
  8. ''' #从 0到10步进为0.123,使用进程池大小为10调用子shell执行脚本

4. 重定向、here document


 
  1. > >> << &> 2&>1 tee

 
  1. > # 标准输出重定向
  2. >> # 标准输出追加重定向
  3. < # 将内容重定向到标准输入
  4. 2> /dev/null # 将标准错误输出重定向到 /dev/null
  5. 2>&1 # 将标准错误输出重定向到标准输出
  6. tee # 标准输出拷贝一份到文件中
  7. cat /etc/passwd | grep root | wc -l
  8. cat /etc/passwd | grep root | tee rootlines.txt | wc -l
  9. cat << EOF
  10. hello user name is $USER
  11. EOF

三. 网络

1. 网络分层、常见端口的应用


 
  1. ipv4 ipv6 tcp udp http ftp ssh vnc ....

 
  1. ifconfig #查询网络接口配置
  2. ssh name@hostname #ssh登录 用户名@hostname
  3. scp -r name@hostname:/home/name/prj ./ #远端复制到本地
  4. scp -r ./prj name@hostname:/home/name/ #本地复制到远端
  5. vncpasswd #设置vnc密码
  6. vncserver :99 #vnc启动服务端口:99为vnc端口(非网络实际端口)
  7. vncserver -list #查看开启的vnc端口
  8. vncserver -kill :99 #关闭99端口vnc

2. 网络信息获取


 
  1. hostname ifconfig ping route netstat ip

 
  1. hostname #查询当前主机名
  2. ifconfig #查询网络接口配置
  3. ping baidu.com #ping域名或ip
  4. netstat -ntlp #查询网络端口使用情况

3. 网络抓包


 
  1. tcpdump tshark wireshark

4. 网络调试


 
  1. netcat socat nmap

 
  1. nc -4 -l localhost 9999 #启动一个ipv4 tcp服务器服务地址为localhost 端口为9999
  2. nc -4 -l localhost 9999 --exec /bin/bash #如上启动一个服务器用子进程/bin/bash来恢复消息
  3. nc localhost 9999 #作为客户端连接localhost:9999

四. shell脚本

1. 脚本执行的三种方式:

  • source : 当前解释器执行脚本内容,会集成执行过程中的环境变量
    source script.sh

  • 行头标注解释器 : 第一行需要指定解释器,如下,后面的/bin/bash则是解释器路径,脚本需要有执行权限,用脚本路径调用,或者放在PATH搜索路径中直接以文件名调用,由于在子进程中调用,所以脚本结束,子进程退出,环境变量消失


 
  1. #!/bin/bash

 
  1. ./script.sh #调用方式
  • 解释器调用脚本 : 第一行可以不用指定解释器,脚本可以没有执行权限,直接用相应解释器加加脚本路径来调用,由于在子进程中调用,所以脚本结束,子进程退出,环境变量消失

 
  1. bash script.sh #调用方式

2. 脚本参数,函数、函数参数、进程返回值


 
  1. $# # 参数个数
  2. $1 # 第一个参数
  3. $2 # 第二个参数
  4. ...
  5. $* # 所有参数
  6. $@ # 所有参数
  7. $? # 上个进程或函数的返回值
  8. $$ # 当前脚本的pid

3. 条件判断


 
  1. # 取反 !
  2. # 一目运算符 -n -z -f -d
  3. # 二目运算符 == != -eq -lt -le -gt -ge
  4. [[ -f test.txt ]] && echo exist
  5. [[ `cat /etc/passwd | wc -l` -gt 10 ]] && echo more than 10 lines

4. 流程控制 , 逻辑判断、基本数据结构与计算

  • 范围 seq for if while expr test

 
  1. for((i=1;i<=10;i++));
  2. do
  3. echo $i
  4. done
  5.  
  6. for name in yang wang li
  7. do
  8. echo $name
  9. done
  10.  
  11. for i in `seq 1 10`
  12. do
  13. echo $i
  14. done
  15.  
  16. i=0
  17. while [[ $i -lt 10 ]]
  18. do
  19. echo $i
  20. let i++
  21. done
  22.  
  23. cat /etc/passwd | while read line
  24. do
  25. echo $line
  26. done
  27.  
  28. while read line
  29. do
  30. echo $line
  31. done < /etc/passwd

五. 高级文本处理

1. 正则regex与高级使用 grep sed awk


 
  1. . #匹配任意字符
  2. [] #匹配一个[]范围内的字符,^取反
  3. ? #匹配0至1个
  4. + #匹配1至任意个
  5. * #匹配0至任意个
  6. {n} #匹配n个
  7. {min,max} #匹配min至max个
  8. | #或
  9. ^ #行首
  10. $ #行尾
  11. <
  12. >
  13.  
  14.  
  15. [a-zA-Z] #匹配一个字母
  16. [0-9] #匹配一个数字
  17. [^0-9] #匹配一个非数字
  18. [0-9]* #匹配一节数字,默认以贪婪算法取最长
  19.  
  20.  
  21. grep --color "o{2,3}" /etc/passwd #查找2到3个o的行
  22. grep --color "[0-9]{2,3}" /etc/passwd #查找有2到3个数字的行
  23. grep --color "(^root|^sshd)" /etc/passwd #查找root或sshd开头的行

2. sed : 匹配与引用、多行处理、流程控制


 
  1. sed -n '/^root/{:begin;n;p;/^adm/b end;b begin;:end}' /etc/passwd #查找用户为root到adm的行
  2. sed -n '/^root/{:begin;N;/ adm/b end;b begin;:end;p}' /etc/passwd #查找用户为root到adm的行

3. awk : 切割,行匹配和处理,流程控制


 
  1. awk -F ":" 'BEGIN{found=0} {if( $1 == "root" ) {found=1};if($1 == "adm"){found=0};if (found==1){print}}' /etc/passwd #查找用户为root到adm的行

你可能感兴趣的