Linux 命令

ubuntu 下的常用命令

Posted by Mr.Children on April 1, 2018

一. 常用文件命令

1. 文件、目录、编辑

cd 、tree、ls、touch
cd -		#切换到上次的目录
cd ~		#切换到用户的家目录
cd .. 		#切换到上一级目录  
cd .		#当前目录  
#显示文件树格式
tree -a		#显示所有文件包括隐藏文件
tree -d		#只显示所有的目录
tree -f		#只显示每个文件的全路径
tree -i		#不显示树枝,常与f 参数配合使用
tree -L 1	#只遍历一层  
ls -a		#显示所有的文件信息,包括隐藏的文件信息
ls -l		#显示详细信息
ls -lR		#递归查看参数
ll与ls -la 相同
touch test.txt			#创建文件
ls -lt		#mtime(最后修改时间)
ls -lc		#ctime(状态改变时间)
ls -lu		#atime(最后访问时间)
touch -d "2 days ago" test.txt		#将日期调整到两天前
touch -t 201406150202 test.txt		#调整日期
mkdir 、ln
mkdir -p			#递归创建多级目录
mkdir -p wei/test
mkdir -v			#创建目录的过程
mkdir -pv wei/{dir1_1,dir1_2}/{dir2_1,dir2_2}	
mkdir -pv test/dir{1..5} wei/{a..g}		#分别创建test/与old/下的多个子文件夹  
#删除一个文件,另一个还在
ln source target		#创建硬链接
ln target source		#删除某个文件后会恢复文件	  
#创建软链接,相当于快捷方式,当前的文件位置可以用`pwd`表示
ln -s source target		#删除源文件会使软链接失效
cp 、mv、rm、rmdir、rename

复制、移动、删除、重命名

cp source target			#基本语法
cp -i					#交互式的操作
cp -a					#保持源文件信息、递归复制、仅复制符号链接
mv source target		#基本语法
mv test1 test2			#将test1重命名为test2
mv dir1 dir2			#如果dir2存在则移动到dir2中不存在就为重命名
rm -fr		#强制递归删除目录内容       
rm -i 		#交互式的删除
rmdir -pv wei		#递归删除空目录
rename "we" "" *			#将所有文件的we替换为空
rename .jpg .jpeg *.jpg			#将所有.jpg 文件的后缀名改为.jpeg	
chown、chmod、chgrp

修改属主、权限、属组

chown -R wei.users test.txt		#wei是用户,users为属组
#r w x 分别对应读 写 执行;u g o 对应的用户 组 其他用户;+ - =
chmod ug+r,o-r test.txt
chmod a = rwx test.txt		#将所有用户的权限修改
chmod u=rwx,go=rx test.txt
# r w x 分别对应的4 2 1
chmod  755 test.txt		# 三个数字分别对应属主 属组 其他用户
chmod -R 755 test.txt 		#递归修改权限
chgrp root tools/		#修改用户属组
cat 、tac
cat <<END >test.txt				#创建新文件
cat -n						#对每一行进行编号
cat -A						#显示完整内容(包括特殊字符)
cat -b						#非空白行显示行号,空白行不显示
cat -E						#把文件末尾的隐藏标志符显示出来$空行也有
cat -s						#把多个空行变成一个空行
cat file1 file2					#共同显示文件
more 、less、head、tail
more -5 test.txt		#每页显示五行,用b 可以翻页 用/可以查询文件
more +888 test.txt		#在第888行开始显示文件的内容
ls -l|more -10			#分页显示文件与目录
less -N test.txt		#显示行号
ls -l | less			#分屏显示结果
less -s test.txt		#多行空格变成一个空格
/						#向后查找字符#向前查找字符
head -n 5 test.txt		#显示前五行
head -2 file1 file2		#现实多个文件的前两行
head -n -100			#列出所有行,不包括后100行
tail -n 5				#列出前5行
tail -n +100			#列出100行以后的数据
sort 、wc 、tee
sort test.txt			#默认是ASCII排序
sort -t	':' -k 2 test.txt		#指定分隔符,并以第二栏来排序
sort -n test.txt		#数字大小排序
sort -nu test.txt		#去除重复
sort file | uniq -d		#获取重复行并输出
sort file | uniq -c		#输出重复行的次数
wc -l test.txt			#显示文件的行数
ls |tee ls.txt			#不仅输出到屏幕上而且会追加到文件中
ls |tee -a ls.txt		#添加a 参数会追加而不是直接覆盖原文件	
iconv
iconv -f gb2312 -t utf-8 GB2312.txt		#将gb2312的格式改成utf-8 格式
tr
tr 'abc' 'def' < test.txt		#不仅仅abc替换为def 而且a-d,b-e,c-f
tr '[a-z]' '[A-Z]' < test.txt		#统一大小写
tr '[0-9]' '[a-j]' < test.txt		#将数字0-9替换为a-j
tr -d 'general' < test.txt		#删除general 所有字符
tr -d '\n\t' < test.txt			#删除换行符和制表符
echo 'wwwweeeeeiii' | tr -s wei		#压缩成一个字符	

2. 文件搜索与用户管理、信息查询

which 、where、locate
#查找命令在哪里,查找的是PATH环境变量的路径
which -a python		#查看所有python 的路径
#定位指定命令的可执行文件,源码文件和man 帮助文件
whereis python
#使用前先updatedb来更新mlocate 数据库
locate my-blog		#将会查找所有包含my-blog 的文件夹或文件

3. 磁盘与文件管理、进程管理、网络管理、系统管理

useradd、passwd、userdel
mount 、umount
# sudo fdisk -l查看设备的位置
mount -t vfat /dev/sdb/ /mnt		#指定文件的类型
mount -r 				#只读挂载
mount -w 				#读写挂载
umount -lf				#直接强制卸载
df 、du、fdisk
/dev/shm/目录是内存虚拟出来的磁盘空间,通常是总物理内存的一半
df -h 			#列出所有的文件系统
du -h		#显示当前目录下所有文件的大小
du -sh		#显示当前目录的总大小
sudo fdisk -l			#查看所有的系统分区
sudo fdisk -l dev/sdb		#查看指定的分区
free、ps、kill、uname
#查看系统的内存  
free -m
ps -ef | grep ssh		#查看特定的进程  
ps -lA				#显示所有进程
pstree				#显示进程树  
kill -l				#显示所有的信号
kill 1234			#kill 默认的是信号15
kill -9 1234			#强制终止PID进程  
#查看内核信息  
uname
netstat 、systemctl
#找出系统上已经在监听的网络连接及其PID 
#centos安装要用 yum install net-tools  
-a		#列出目前系统上所有的连接、监听、socket信息  
-t		#列出tcp网络封包信息  
-u		#列出udp网络封包信息  
-n		#不以进程的服务名称,以端口号来显示  
-l		#列出目前正在网络监听的服务  
-p		#列出该网络服务的进程PID
netstat -tulnp  
#管理单一服务的启动、开机启动与查看状态  
systemctl [command] [unit]  
start stop restart reload enable disable is-active is-enable
status
ssh
ssh -p 22  root@104.207.129.72 		#指定端口22
passwd:
wget
wget -O /home/wei/1.txt http://www.baidu.com		#指定文件的名称
wget -c http://www.baidu.com				#断点续传
wget -b http://www.baidu.com				#后台下载
wget --user-agent="" http://www.baidu.com		#伪装成代理下载
lsof 查看进程打开的文件
lsof -i :22		#显示端口为22 的进程
lsof -i tcp		#显示所有tcp 网络连接的进程信息
free -m -h 显示内存的使用情况
uname

查看系统的内核文件

4. 文件备份与压缩命令

tar 、bzip2、xz、gzip、zip与unzip
-z 		#通过gzip压缩或解压
-c 		#创建新的tar包
-v 		#显示详细的tar命令执行过程
-f 		#指定压缩文件的名称
-j 		#通过bzip2方法压缩或解压
-J		#通过xz方法压缩或解压缩
-C 		#指定解压的目录
tar -zcvf 1.tar.gz ./home/
tar -zjvf 1.tar.bz2 ./home/
tar -zJvf 1.tar.xz ./home/
tar -zxvf 1.tar.gz -C /tmp/		#解包到指定目录
tar -ztvf 1.tar.gz			#不解压查看文件的内容
#bzip2的使用参数与gzip一样,比它更大的压缩比
#bzcat、bzgrep、bzless、bzdiff
#xz的使用参数与gzip一样,比bzip2有更大的压缩比
#xzcat、xzgrep、xzless、xzdiff
gzip -dv 1.gz			#解开文件
gzip -l 1.gz			#不解压列出文件的内容信息 
gzip -c 1 >1.gz 		#将内容输出到标准输出,不改变原始文件
gzip -dc services.gz >services
gzip-r				#对目录下的文件进行递归操作
#zcat\zgrep\zless\zdiff 都可以不解压直接操作压缩文件
zip services.zip ./services
zip -r tmp.zip /tmp/			#指定目录下的所有文件和子目录一并压缩
zip -r tmp.zip /tmp/ -x tmp/services.zip#压缩文件时排除某个文件
unzip -l tmp.zip			#不解压显示压缩包的内容
unzip -d /tmp tmp.zip			#指定解压目录
scp 的使用
# 将本地文件clone 到服务器上
scp  /home/wei/wode.txt  root@104.207.129.72:/home/wei 
# 将服务器上的文件下载到本地
scp root@104.207.129.72:/home/wei/wode.txt /home/wei/
# 复制文件夹,要加上r 参数
scp -r /home/wei/test root@104.207.129.72:/home/wei/

二. 三大文本工具

1. grep 的使用

正则表达式的匹配规则

#显示行号,前3行,后4行
grep -n -B3 -A4 're' test.txt
grep -v 're' test.txt		#排除某些行
grep -n 're' test.txt		#显示匹配的行以及行号
grep -n '.' test.txt		#显示所有行的行号
grep -i 're' test.txt		#不区分大小写的过滤内容
grep -c 're' test.txt		#只统计匹配的行数
grep -o 're' test.txt		#只输出匹配的内容
grep -w 're' test.txt		#只匹配过滤的单词
grep -Ei 're|world' test.txt		#同时过滤多个字符
grep -Ev '^$|#' test.txt		#去除里面的空行和注释
grep -n 't[ae]st' test.txt		#选择tast、test
grep -n '[^g]oo' test.txt		#^表示排除g
grep 'w[^ ]*.html' test.txt	#限定中间不能有空格
grep '^http' test.txt		#获取以http开头的行
grep '^[a-z]' test.txt		#开头为a-z
grep -n '\.$' test.txt		#以.为结尾
grep '^$' test.txt			#获取空行,^,$分别为行的开头和结尾
grep 'html$' test.txt		#获取html结尾的行
grep '[0-9]' test.txt			#获取包含数字的行
grep 'w...html' test.txt		#中间只能有两个字符
grep 'w.{2}.html' test.txt	#中间只能有两个字符

2. awk 的使用

- $0表示一行,$1表示第一列  
- NF每一行($0)拥有的字段总数
- NR目前awk所处理的是第几行数据  
- FS目前的分割字符,默认为空格键  
last -n 5|awk '{print $1 "\t lines:" NR "\t columns:" NF}'
cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t" $3}'
#预先设置awk的变量利用BEGIN这个关键词  
cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}'
#计算并且格式化输出  
vim pay.txt  
Name	1st	2nd	3th  
VBird	23000	24000	25000  
DMTsai	21000	20000	23000  
Bird2	43000	42000	41000  
cat pay.txt|awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"};NR>=2{total=$2+$3+$4; printf "%10s %10d %10d %10d %10.2f\n", $1,$2,$3,$4,total}'
#格式化输出常见格式  
-%ns,表示多少个字符
-%ni,表示多少整数位   
-%N.nf,小数点的位数
awk 'NR==5' test.txt		#显示第五行的内容
awk 'NR==2 NR==6' test.txt		#显示2-6行的内容
awk '{print NR,$0}' test.txt			#为每一行添加行号
awk -F ":" '{print $1,$3,$NF}' test.txt		#分别打印三个部分的内容
awk 'NR%2==0' test.txt		#输出偶数行
awk 'NR%2==1' test.txt		#输出奇数行

3. sed 的使用

#删除文字
sed -n '2,4p' test.txt		#输出第二到第四行
sed '/^$/d' test.txt			#删除空行
sed '2,3d' test.txt			#删除2-3行
sed '1~2d' test.txt			#偶数行
sed '1~2!d' test.txt		#奇数行
#添加文字
sed '2a my name is wei' test.txt			#在第二行后面添加文字
sed '2i my name is wei' test.txt			#在第二行前面添加文字
#替换功能
sed -i 's/The/nihao/g' test.txt				#-i为直接修改源文件
sed "s/ /_/" test.txt		#一次替换
sed "s/ /_/g" test.txt		#全部替换
sed 's/ /_/1' test.txt				#替换第一个空格
sed 's/ /_/2' test.txt				#替换第二个空格
sed 's/ /_/2g' test.txt				#替换第二个以及以后的空格
sed '2,5 s/_[0-9]//g' test.txt		#针对指定行的替换
sed '2,5c 哈哈哈' test.txt			#将2-5行的文字替换 

三. vim 的基本使用

#翻页、跳转与查找
ctrl + f			#向下翻动一页
ctrl + b			#向上翻动一页
0或home				#移动到这一行的最前面字符
$或end				#移动到这一行的最后面字符
G					#移动到文件的最后一行
5G					#跳到第五行
gg					#移动到文件的第一行
n<enter>			#n为数字,光标向下移动n行
/word				#向下查找字符串
#复制与删除
dd					#删除一行
30dd				#删除30行
yy					#复制一行
3yy					#复制三行
p					#粘贴到下一行
P					#粘贴到上一行
u					#撤销上一次操作
ctrl+r				#重做撤销的操作
.					#重复上一次操作
y$					#从当前复制到行尾
d$					#从当前删除到行尾  
#替换  
:s/w/a/				#替换当前行第一个w为a  
:s/w/a/g			#替换当前的所有行  
:n,$s/w/a/			#替换第n行到最后一行的第一个替换  
:n,$s/w/a/g			#替换所有的  
:.,$s/w/a/g			#从当前行开始  
:%s/w/a/g			#替换所有的
#vim编辑器的设置
:set nu				#设置行号
:set nonu			#取消行号
:set backup			#自动保存备份文件 filename~
:set bg=dark		#设置背景
:set bg=light		#
#可视化区块(Visual Block)
v					#字符选择,选过的反白
V					#选过的行反白
[ctrl]+v			#矩形选择
y					#复制反白的地方
d					#删除反白的地方
p					#粘贴
#多个文件编辑
:n					#编辑下一个文件
:N					#编辑上一个文件
:files				#列出这个vim编辑的所有文件
#多窗口功能  
首先打开一个文件,然后输入
:sp [filename]
[ctrl]+w+j或↓		#光标移动到下面
[ctrl]+w+k或↑		#光标移动到上面
[ctrl]+w+q			#退出窗口
#切换
:wq					#保存退出
:wq!				#强制保存并退出
:q
:q!					#强制退出

vim的配置设置通常在/etc/vimrc,我们修改~/.vimrc

set hlsearch			"高亮度反白
set backspace=2			"可随时用退格键删除
set autoindent			"自动缩进
set ruler				"可显示最后一行的状态
set showmode			"左下角那一行的状态
set nu					"显示行号
set bg=dark				"显示不同的色调
syntax on				"语法检查,颜色显示

四. Shell 脚本的基本语法

Bash 特殊字符
\*:匹配任何字符
**:匹配任何字符串
*?:匹配任何单个字符  
用一些单个字、一个连续范围或断续的字符集合作作为通配符  
[a-z]:用字符集合作通配符匹配单个字符,如:[aeiou],[a-o],[A-Z],[0-9]  
[!A-Za-z0-9]:除了集合外的所有字符组成的集合作为通配符  
c{a{r,t,n},b{r,t,n}}s可以匹配cars cats cans cbrs cbts cbns    
():子shell运行;比如(cd ehbio;mkdir ysx)进入ehbio 目录,新建ysx文件夹,运行完之后还在当前目录  
':强引用字符串,不解释特殊字符
":弱引用字符串,解释所有特殊字符  
;:命令分隔符(命令终止符),运行在一行里执行多条命令;一般在终端直接写判断语句或执行for循环时用  
#:行注释
$:变量表达式,变量解析&:在后台执行命令,在for 循环中也可以作为命令分隔符,取代done前面的;  
Bash 变量
varname=value  
在引用变量可以直接$varname 或者${varname}  
为了使变量可以在其他进程中使用,需要将变量导出:export varname   
var="a is $li",var='a is $li'前者特殊字符保持原本特性,后者一般字符  
对应于命令行参数,其中$0为脚本名称,$1为第一个参数  
参数超过9个必须使用 ${}引用变量。shell 保留这些变量  
不允许用户以另外的方式定义它们,传给脚本或函数的位置  
变量是局部和只读的,而其余变量为全局的。  
$?:保存前一个命令的返回码;0为运行成功,常用来判断上一个程序的退出状态  
$$:当前shell的进程号  
$!:上一个子进程的进程号  
$#:传给脚本或函数的参数个数,即位置变量数减1(1代表脚本自身)  
$*$@:传给脚本的所有参数(不包含脚本本身),每个参数以$IFS分隔  
(一般为空格,TAB,换行);两者的不同点是引号括起来,前者  
作为一个整体,后者还是单个的参数   
cat ehbio_testParam.sh  
#!/bin/bash  
echo "EHBIO${IFS}great" 
echo '$*' 
echo -ne "\t"; 
echo $*   
echo '$@'  
echo -ne "\t"  
echo $@  
echo 'Each element in $*:'  
for i in "$*"; do  
    echo -ne "\t";
    echo $i;
done  
echo 'Each element in $@:'  
for i in "$@"; do  
    echo -ne "\t";  
    echo $i;  
done  
#bash ehbio_testParam.sh sheng xin bao dian  
Bash 操作符
${var:-word}: 如果 var 存在且不为空, 返回它的值, 否则返回 word   
${var:=word}: 如果 var 存在且不为空, 返回它的值, 否则将 word 赋给 var, 返回它的值 
${var:+word}: 如果 var 存在且不为空, 返回 word, 否则返回空 
${var:?message}如果 var 存在且不为空, 返回它的值,   
否则显示 “-bash: var: message”, 然后退出当前命令或脚本 
${var:offset[:length]}从 offset 位置开始返回 var 的一个长为   
length 的子串, 若没有 length, 则默认到 var 串末尾  
echo ${var:?message}  
var = 'sheng xin bao dian'   
echo ${var:6:3}  #第六个开始截取3个  
echo ${var:?message}    
${var#pattern}从 var 头部开始, 删除和 pattern 匹配的最短模式串, 然后返回剩余串  
${var##pattern} 从 var 头部开始, 删除和 pattern 匹配的最长模式串, 然后返回剩余串, basename path = ${path##*/}    
${var%pattern}从var尾部开始,删除和pattern匹配的最短模式串,然后返回剩余串,dirname path = ${path%/ *}  
${var%%pattern}从 var 尾部开始, 删除和 pattern 匹配的最长模式串, 然后返回剩余串
${var/pattern/string}用 string 替换 var 中和 pattern 匹配的最长模式串
Shell 中条件和test命令
-d file: file 存在并且是一个目录   
-e file: file 存在   
-f file: file 存在并且是一个普通文件   
-g file: file 存在并且是 SGID(设置组 ID) 文件   
-r file: 对 file 有读权限   
-s file: file 存在并且不为空   
-u file: file 存在并且是 SUID(设置用户 ID) 文件   
-w file: 对 file 有写权限   
-x file: 对 file 有执行权限, 如果是目录则有查找权限   
-O file: 拥有 file   
-G file: 测试是否是 file 所属组的一个成员   
-L file: file 为符号链接   
file1 –nt file2: file1 比 file2 新  
file1 –ot file2: file1 比 file2   
str1=str2   #匹配  
str1!=str2  #不匹配  
str1>str2   #str1大于str2  
-n strstr 的长度大于 0(不为空)-z strstr 的长度为 0(空串),  
常用于判断必须的命令行参数是否传入
#字符串的大小比较的是最先遇到的不同的ASCII码的大小   
if test "10">"20"; then echo "10>20"; fi  if test 10>20; then echo "10 < 20"; fi  
var1 –eq var2 var1 等于 var2 
var1 –ne var2 var1 不等于 var2 
var1 –ge var2 var1 大于等于 var2 
var1 –gt var2 var1 大于 var2 
var1 –le var2 var1 小于等于 var2 
var1 –lt var2 var1 小于 var2  
ge: great equal;gt: great than
#数学表达式也可以  
if (( 3>2 )); then echo 'TRUE'; fi   
!expr对 expr 求反  
expr1 && expr2对 expr1 与 expr2 求逻辑与, 当 expr1 为假时不再执行 expr2   
expr1 || expr2对 expr1 与 expr2 求逻辑或, 当 expr1 为真时不再执行 expr2 
Shell 控制流
if,then,elif,else,fi是关键词其他的是要替换掉的  
if conditions; then  
    do sth when conditions are true  
elif another_conditions; then  
    do sth when another_conditions are true  
else:  
    do sth when above conditions are all false  
fi  
if test $guanzhu_sxbd == "already"; then  
    echo "Enjoy it"  
elif test $guanzhu_hjyz == "already"; then  
    echo "Enjoy it"  
else
    echo "Guanzhu them"  
fi 
for i in a; do  
    echo "$i";
done
declare -i a    #定义整数变量  
a=1 #初始化变量  
while test $a -lt 3; do #小于则为真 
    echo $a  
    a=$a+1  
done  
echo $a
Shell 函数
cat test_func.sh  
function show_ehbio()  {
    echo $@  
    echo $1
} 
show_ehbio "EHBIO great" "SXBD great"  
bash test_func.sh
输入输出
#I/O 重定向  
<:输入重定向       
>:输出重定向(没有文件则创建,有则覆盖)       
>>:输出重定向(没有则创建,有则追加到文件尾部)       
<<:输入重定向
#命令关联性  
"; && ||",cmd1 command cmd2
顺序执行;cmd1正确执行cmd2,错误不执行cmd2;cmd1正确不执行cmd2,错误执行cmd2
#管道命令
"|"