shell 常用命令
例举一些常用的shell命令
shell的基本能力
linux的设计理念,就是用shell命令来完成很多复制的工作。 shell包含特色功能。
通配符
包括 *
,花括号展开,引号等高级用法。
echo ~
echo可以用来看通配符的展开情况
重定向
> 重定位到文件 >> 是追加内容
ls -l /bin/usr > ls-output.txt 2>&1
其中2>&1
将标准错误重定向到标准输出> /dev/null
重定向到null,相当于忽略输出管道
可以对文本做多个复杂的处理
cat .bash_history |sort|uniq -c|sort -rn|head
看历史命令使用最多的前几条(uniq前必须先排序)组合命令
command1,command2
历史命令
ctrl+r 搜索历史命令
shell脚本
a = $(command)
执行命令的返回,赋值给变量if [ -n "$a" ]
变量就是对其展开,如果把变量字符串用,可以
#nohup 应用程序名 &
此后,如果你断开了ssh,程序依旧运行。
文本处理
查看文本 (cat,less,more,vi,od)
cat
,less
,more
,vi
,od
都可以对文件进行查看。
cat -n
输出带行号less
view file 代替more,可以前后翻页od -x
或则hexdump
以16进制的方式查看文件
grep
常用选项
选项 | 描述 |
---|---|
-n | 匹配结果的时候,给出行号 |
-C10 | 输出匹配行号,并输出上下n行 grep -C10 pattern filename |
-r | 查找文件夹 grep -r xx ./ |
-E | 使用扩展正则,可以同时匹配多个表达式 grep -E "pattern1|pattern2" filename |
none | 多次查找 grep 'xx' filename| grep 'yy' |
-i | 忽略大小写 |
awk
按照给定分隔符,一般是空格,将文本当做表格处理。在需要对查找出来的问题,做高级统计的时候需要用到
grep '过期' logs/message.log |awk '{sum+=substr($8,7)} END {print sum}'|more
文件操作
文件信息 file stat du
- file 查看文件的类型
- stat 文件修改时间
- du 文件夹大小
du -m|sort -rg|less
显示并对其排序du -sh *
文件夹大小
远程文件拷贝 scp sftp
scp 和 sftp 可以通过ssh在服务器之间传输文件。
scp -P22 fixAgent.jar root@192.168.2.207:~/fixAgent.jar
通过ssh将本地的文件复制到远端sftp root@192.168.2.207
查找文件 locate find
快速的查找。locate 查询路径数据库,find 便利查找。
find / -name "system.map"
find ~ -type d
只搜索目录find ~ -type f -name "\*.JPG" -size +1M
更多的过滤条件
压缩文件 tar
tar -xvf archive_name.tar.gz
解压文件tar -cvf 1.ar *
压缩文件
符号链接 ln
ln -s file link
-s 软连接,可以是目录
文件比较 diff
diff file1 file2
比较文件的差异
diff <(printenv) <(env)
对于标准输出,可以直接进程替换比较
工具
wc
统计行数或则字数
md5sum file
文件的md5码
df
free
watch
周期的执行给定命令。
watch -n1 "netstat -ano|grep 10001 -c"
不加n就默认两秒执行一次。
screen
screen -ls
screen的列表
screen -rd name
重新连接一个会话
screen -S name
新建screen,并给个name
退出screen ctrl+A,D
` screen -X -S 19216 quit` 删除session
访问网页
curl -u username -d “param1=value1¶m2=value” https://api.github.com curl -G -d “test=string” http://www.baidu.com
tcpdump
抓包 tcpdump -i eth0 -nn port 9001 tcpdump -i eth0 -s 0 -w SuccessC2Server.pcap port 10001
系统信息
硬件信息
lscpu
cpu信息概况,能看出是否虚拟化cat /proc/cpuinfo
更详细的cpu信息/sys/devices/system/cpu/
中更详细的cpu信息cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
cache_line大小- 硬盘s使用情况
df -h
-h
单位是g - 内存使用信息
free -m
更详细的信息cat /proc/meminfo
环境变量
- 全部环境变量
printenv
orenv
- 输出单个环境变量
echo $HOME
/etc/profile
定义的地方
ssh
- ssh配置免密输入,可以更方便的scp和执行远端命令。
通过
ssh-keygen -t rsa
生成rsakey,一般在~/.ssh/
里面,并加入远端的服务器cat id_rsa.pub >> ~/.ssh/authorized_keys
- 远端执行命令
ssh root@192.168.2.207 'df -h'
- ssh隧道
ssh -L 8008:web:80 root@sshserver
通过ssh服务器访问内网环境
cpu使用率
cpu作为程序执行的主体,分析cpu的工具比较多,perf
,top
,vmstat
,VTune
perf
非常强大的性能分析工具。甚至能对cache miss和内核切换做分析。
linux下的sar
是比较全面的性能分析工具,包括iostat,vmstat。
perf
看cpu L1Cache的miss 情况
perf stat -e L1-dcache-load-misses java L1CacheMiss
top
VIRT:进程占用的虚拟内存
单个进程的线程占用情况
top -H -p
load average:加载平均值是指,等待运行的进程数目。第一个是最后60秒的平均值,下一个是前5分钟的平均值,最后一个是前15分钟的平均值,低于1就是工作不忙碌。
磁盘利用率,磁盘队列
iostat -xm 1
每秒查看磁盘的读写量。-x
显示更详细的统计信息,-m
用megabytes为单位显示统计信息。
关注写入速度,await时间等。
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 0.38 0.12 0.00 99.25
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 18.00 0.00 0.04 4.00 0.03 1.83 0.00 1.83 0.67 1.20
vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
内存
vmstat
的si
代表从磁盘换入,so
代表换出。正在内存交换的系统性能很差。- r:运行队列,运行队列于处理器个数 代表cpu执行不过来了
- b: 等待io队列。The number of processes in uninterruptible sleep
- swpd:virtual memory
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 6288620 75888 349184 0 0 0 3 0 0 0 0 100 0 0
0 0 0 6288480 75888 349184 0 0 0 0 844 1664 0 0 100 0 0
netstat -r
路由表
netstat -s # 查看网络统计信息
netstat -anotp
查看所有tcp链接,p
显示pid。n
显示原始地址,不用试图解析。o
包括网络计时器。
Recv-Q和Send-Q 可以看TCP缓存区的情况。来断定是否TCP已经来不起接收或者发送。
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
tcp 0 0 0.0.0.0:8060 0.0.0.0:* LISTEN 15848/nginx: master off (0.00/0/0)
tcp 0 0 127.0.0.1:9121 0.0.0.0:* LISTEN 16470/redis_exporte off (0.00/0/0)
tcp 0 0 192.168.2.207:30000 192.168.101.102:62645 ESTABLISHED 5546/mongod keepalive (290.00/0/0)
tcp 0 28 10.0.0.14:10001 115.52.169.241:26370 ESTABLISHED 8427/java on (79.60/5/0)
socket状态统计
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
看tcp缓存区的使用情况 netstat -anp|grep 6010|awk ‘{sums+=$3; sumr+=$2} END {print “sumSend =”,sums,”sumRece=”,sumr}’
来自 http://www.cnblogs.com/sunxucool/p/3449068.html ss -i 可以看到rtt等内部相关的消息
网络使用率
ifconfig
,netstat
,ifstat
。
其它
- 执行时间
time command
- 查看定时任务列表
crontab -l
- 系统启动时间
who -b
uptime
- 活动用户
who
- 计算机名
hostname
- 查看用户登录日志
last
- 设置时间
date -s 02/11/2012
- 重启
reboot
- 切换用户
su near
su -
切换到超级用户 - CentOS版本
cat /etc/redhat-release
“CentOS Linux release 7.2.1511 (Core)” - /etc/passwd 修改登录后的默认路径
进程
ps
ps aux
x显示全部进程,au能显示更多的信息。TIME 字段表示进程所消耗的 CPU 时间数量。USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 190716 3252 ? Ss 2018 5:06 /usr/lib/systemd/systemd --system --deserialize 17 root 2 0.0 0.0 0 0 ? S 2018 0:17 [kthreadd] root 3 0.0 0.0 0 0 ? S 2018 1:39 [ksoftirqd/0]
-o
可以指定额外的列显示得到更详细的进程信息。ps -eo pid,lstart,etime|grep 17862
ps -p 15202 -o etime=
etime为执行了多久,格式是[[DD-]hh:]mm:ss
。lstart是开始执行时间。PID STARTED ELAPSED 10899 Fri Mar 15 12:28:07 2019 02:29:39 15372 Thu Feb 28 12:42:51 2019 15-02:14:55 ......
ps -eLf|grep pid -c
看pid的进程有多少个线程
进程详细信息 (/proc/pid/)
这里包含进程相关的很多信息
ll /prod/pid
可以看到很多信息,进程的工作目录和执行的命令等。lrwxrwxrwx 1 root root 0 Mar 15 12:33 cwd -> /home/brgzadmin/online/server -r-------- 1 root root 0 Mar 15 12:33 environ lrwxrwxrwx 1 root root 0 Mar 14 15:05 exe -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64/jre/bin/java
cat /poc/pid/maps
进程的内存布局
offset - If the region was mapped from a file (using mmap), this is the offset in the file where the mapping begins. If the memory was not mapped from a file, it’s just 0. mmap: It implements demand paging。不会读取全部文件
address perms offset dev inode pathname
00601000-00602000 rw-p 00001000 fd:01 134498201 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64/jre/bin/java
00ee6000-00f07000 rw-p 00000000 00:00 0 [heap]
85a00000-a6e80000 rw-p 00000000 00:00 0
......
ll fd
进程打开的句柄。如果持有一个输出文件。就算被删除,也能找回来。lr-x------ 1 root root 64 Mar 15 12:37 0 -> /dev/null l-wx------ 1 root root 64 Mar 15 12:37 1 -> /home/brgzadmin/online/server/out.txt lr-x------ 1 root root 64 Mar 15 12:37 10 -> /home/brgzadmin/online/server/lib/serial-client.jar lr-x------ 1 root root 64 Mar 15 12:37 100 -> pipe:[30756313]
top
top -d 30 -p $pid -b
统计指定进程的cpu占用。-b 可以作为输出,一直记录
lsof 打开的文件
lsof -i:22
条件过滤 -i
网络
Traceroute ip
查看经过的路由器,如果中间的路由器不支持返回信息,就会显示***
traceroute: Warning: www.baidu.com has multiple addresses; using 61.135.169.125
traceroute to www.a.shifen.com (61.135.169.125), 64 hops max, 52 byte packets
1 192.168.200.1 (192.168.200.1) 6.941 ms 5.138 ms 4.306 ms
2 * * *
cat /proc/net/dev
看网络流量
route
用于查看那系统的路由表信息
nslook
nslook www.baidu.com 通过域名 查ip
帮助
man
man 7 socket
显示socket entry在section 7的内容。看man手册的不同section,可以用man man
man -k xxx
在man手册中搜索对应的entries
man -K xxx
大写K,搜索man手册中所有内容
section | 内容 |
---|---|
1 | 用户命令 |
2 | 程序接口内核系统调用 |
3 | C 库函数程序接口 |
4 | 特殊文件,比如说设备结点和驱动程序 |
5 | 文件格式 |
6 | 游戏娱乐,如屏幕保护程序 |
7 | 其他方面 |
8 | 系统管理员命令 |
系统日志
- dmesg -T 内核日志
- /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
更多
关于系统方面的命令,在《性能调优》有更多的分析。
Linux命令总结 http://linuxtools-rst.readthedocs.org/zh_CN/latest/index.html