Linux
Linux 的文件系统称作为 虚拟文件系统, Visual File System.
- bin (binaries) 存放二进制可执行文件
- sbin (superuser binaries) 存放二进制可执行文件,只有root才能访问
- etc (et cetera) 法语, 中文等等的意思, 存放系统配置文件
- usr (unix shared resources) 用于存放共享的系统资源
- home 存放用户文件的根目录
- root 超级用户目录
- dev (devices) 设备. null 是一个空设备, 可以写如何数据进去.
echo "hello" > /dev/null
, 像个垃圾桶. - lib (library) 存放跟文件系统中的程序运行所需要的共享库及内核模块
- mnt (mount) 系统管理员安装临时文件系统的安装点
- boot 存放用于系统引导时使用的各种文件
- tmp (temporary) 用于存放各种临时文件
- var (variable) Variable Data File, 用于存放运行时需要改变数据的文件, 存储运行时的数据, 像 log 之类的.
- proc (process) 进程和内核信息在这个目录下面.
PipeLine : 进程间通信的手段. 本质上也是一种文件, FIFO. 将一个进程的输入传递给另一个进程.
Shell : 命令解释器, 可编程. 在没有图形界面时, shell其实就充当了用户界面.
PS: 实际指令的具体用法, 使用man
指令查看.
man
有事就找男人。
# space 下一页 b 前一页
# enter 下一行 k 前一行
man xxx
# 搜索 n 下一个 N 上一个
# 向后查找
/keyword
# 向前查找
?keyword
系统
# 查看当前shell
echo $SHELL
# 查看当前系统的shell
cat /etc/shells
# 切换shell
chsh -s shell_path
# 查看内存剩余
free -h
free -m
cat /proc/meminfo
# 查看硬盘剩余
df -ah
# 查看文件夹大小
du -sh
# 查看当前文件夹的占用
du --max-depth=1 -h
# 查看系统
uname -a
lsb_release -a
cat /etc/issue
cat /etc/os-release
# 查看cpu信息
lscpu
cat /proc/cpu
# 查看内存硬件信息
dmidecode -t memory
# 查看系统安装的locale
locale -a
# uuid生成
uuidgen name
# 查看设备的uuid
blkid
ls -l /dev/disk/by-uuid
# 查看安装内核
mhwd-kernel -li
# 查看指令的位置
which xxx
whereis xxx
# 查看当前用户是谁
whoami
# 查看当前登录的用户
who
# 查看启动时间
cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'
date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
# 查看启动时间
who -b
who -r
# 查看历史启动时间
last reboot
last reboot | head -1 # 最后一次历史启动时间
文件
# 创建文件夹, -p 如果父目录不存在也一起创建
mkdir folder -p
# 移动文件或重命名
mv file target
# 删除文件 -rf -force 强制 -recursion 递归
rm file
# 查看文件的详细时间
ls --full-time
# 查看所有文件
ls -af
# 查看文件类型
ls -F
# 目录树
tree / -L 1
# change file timestamps 修改文件时间
touch
权限
# 权限 Read Write Execute RWE | User Group All 3*3=9 种组合
# > 重定向 标准输出流和输入流都是文件
# 把用户添加到组里
usermod -a -G root esuser
# 删除的命令依靠的是目录的权限
# 修改文件权限 7 是 111 二进制 777 就是9个1 rwx 666 -> rw-
chmod 777 file
# 修改文件所有权 组:用户
chown xxx:xxx file
进程
# 进程查询
ps -ef
ps -aux
jps -l
# 关闭进程
kill -9 pid
# 查看后台任务 按ctrl+z把后台任务
jobs
# 后台进程放前台
fg %n
# 后台运行任务
nohup xxxx 2>&1 &
# killall 探测进程是否存在
killall -0 process_name
# 返回0说明找到进程
echo $?
# 查找进程执行程序位置
# 先使用 ps 找出 pid
ls /proc/pid/cwd
网络
# 查看ip地址 loopback 发生到本机的
# 127.0.0.1/8 8是8个1, 255, 子网掩码 255.0.0.0, 用来计算网络号
ip addr
ifconfig
# 查看端口 t tcp协议 l 连接中的 p 程序名称
netstat -tunlp | grep xxx
netstat -anps
# 查看网络状态 查看socket数
netstat | wc -l
netstat -t tcp
# ping用的是udp协议 dns 有可能在本地完成, 访问过可能会有缓存的
# round trip 来回时间
ping address
# ping网络
telnet IP:PORT
# dns 查询 bind-utils 工具
host www.baidu.com
big www.baidu.com
# 访问
curl www.baidu.com
# 只看响应头
curl -I www.baidu.com
时间同步
sudo apt-get install ntpdate
# 同步网络时间 ntp1.aliyun.com
ntpdate cn.pool.ntp.org
# 查看硬件时间
hwclock -r
# 将系统时间写入硬件时间
hwclock -w
设置时区
# 根据提示选择
tzselect
# 修改profile文件
vim /etc/profile
TZ='Asia/Shanghai'
export TZ
source /etc/profile
# 测试
date
# 注:linux系统启动时,系统时间同步硬件时间
hwclock
归档相关
# 解压zip
unzip filename.zip -d targetDir
# 解压filename.tar.gz
tar -zxvf filename.tar.gz -C targetDir
# z : gzip 压缩格式
# x : extract 解压
# v : verbose 详细信息
# f : file(file=archive) 文件
# 解压filename.tar.bz2
tar -jxvf filename.tar.bz2
# j : bzip2 压缩格式
# 解压filename.tar.xz
tar -Jxvf filename.tar.xz
# 解压filename.tar.Z
tar -Zxvf filename.tar.Z
# z: gzip 后缀 .gz
# j: bzip2 后缀 .bz2
# J: 后缀xz
# Z: compress 后缀 .Z
# 打包 gz
tar -czf file.tar.gz
# 指令详情
tar --help
文件查看
# 线上环境注意不要使用cat, 因为会把整个文件都作为输出流
cat file
# 查看文件,排除 # 注释. 如果是大文件, 可以只读一部分. less 是交互式的界面, 是后来的一个工具, 其实区别不大.
more file | grep ^[^#]
less a.txt
# 看头部的一行
head a.txt -n 1
# 看尾部的一行
tail a.txt -n 1
查找
# 默认是在当前目录递归查找
find -name "filename"
# 全局搜索
find / -name "filename"
# 查找当前用户home目录下的target开头的文件 大小写敏感的
find ~ -name "target*"
# 忽略大小写
find ~ -iname "target*"
# 查找整个机器有多少个 java 文件
# -l 行数 -c 字节数
find / -name "*.java" | wc -l
# xargs 模板指令 cat 所有文件到输出流了
# 看到所有 java 代码的行数
find / -name "*.java" | xargs -I {} cat {} | wc -l
# 移除所有指令
find / -name "*.java" | xargs -I {} rm {}
# 检索文件内容 全称 : Global Regular Expression Print
grep "content" target*
管道操作符 |
可将指令连接起来, 前一个指令的输出(STDOUT)作为后一个指令的输入(STDIN)
# 创建一个管道文件
mkfifo aaa
# 列举当前目录的所有文件 然后查找 包含指定字段的内容
find ~ | grep "target"
# 多级筛选 -o 只输出匹配的内容, 可配合正则表达式
grep "content" tmp.log | grep -o "engine\[0-9a-z*\]"
# -v 过滤掉相关字符串的内容
ps -ef | grep redis | grep -v "grep"
对文件内容做统计
awk [options] 'cmd' file
- 一次读取一行文本, 按输入分隔符进行切片, 切成多个组成部分
- 将切片直接保存在内建的变量中, $1, $2…($0表示行的全部)
- 支持对单个切片的判定, 支持循环判定, 默认分隔符为空格
# 打印第一个切片和第四个切片的内容 分隔符默认是空格
netstat -tunlp | awk '{print $1,$4}'
# 筛选出 tcp 的内容 即筛选某一列的数据
netstat -tunlp | awk '$1=="tcp" && $2==0{print $0}'
# 表头也打印出来 使用 NR
netstat -tunlp | awk '($1=="tcp" && $2==0) || NR==1 {print $0}'
# 指定分隔符 -F
awk -F "," '{print $2}'
# 对每行出现的次数进行统计 END 扫描结束后的操作 这里是遍历前面扫描结果
grep "content" tmp.log | grep -o "engine\[0-9a-z*\]" | awk '{enginearr[$1]++}END{for(i in enginearr)print i "\t" enginearr[i]}'
批量替换文档内容
sed [option] 'sed command' filename
全名 : Stream Editor 流编辑器
# s 代表字符串操作
# ^ 以什么开头的
# 第一个反斜杠之间是 要替换的内容
# 第二个反斜杠之间是 替换成的目标内容
# 默认情况下 只是把输出内容显示在终端 要替换写入到文件, 加 -i 参数
sed -i 's/^Str/String/' replace.java
# $ 以什么结尾
# . -> ;
sed -i 's/\.$/\;' replace.java
# /g 全文替换 默认是替换一行中的出现的第一个符合条件的字符
sed -i 's/Jack/me/g' replace.java
# 删除空行 /d 删除符合条件的行
sed -i '/^ *$/d' replace.java
SSH相关
# 登录
ssh user@host
# 远程拷贝文件
scp filename [email protected]:/usr/local/redis/
# 根据用户名生成公钥私钥
ssh-keygen -t rsa-f ./google -C root
创建swap
# 创建swaps
# 4096000 4g大小
dd if=/dev/zero of=/swapfile bs=1024 count=4096000
# -bash: mkswap: command not found
# 如果找不到相关指令,就在 /sbin/ 下找下看
mkswap /swapfile
# 修改文件权限
chmod 0644 /swapfile
# 启动swapfile这个文件
swapon /swapfile
# 每次开机时自动加载swap文件,
# 需要在 /etc/fstab 添加swap文件
/swapfile swap swap defaults 0 0
# 查看swaps
cat /proc/swaps
# 关闭swap
swapoff -a
# 开启swap
swapon -a
实用工具
# 开始记录操作
script
# 退出记录操作
exit
# 命令手册 查看各种命令行的使用例子
tldr
# 性能监控工具
nmon
# 文件例举工具
tree
# io检测工具
iostat
# 查看网络状态
# 安装
apt-get install iftop
# 卸载
apt-get remove iftop
# 使用 按q退出监控
iftop