常用命令


系统文件管理命令
Usage: mkdir [OPTION]... DIRECTORY... # 看到语法中含有中括号的,可加可不加 ()必须加
Create the DIRECTORY(ies), if they do not already exist.
创建单个或多个目录如果他们不存在
-m:创建目录的时候,给权限
-p:递归创建目录,如果目录已经存在,则不创建并且 (不报错),修改目录的属性
-v:显示创建目录的信息

*随笔* : Linux中同一级目录和文件不能同名,不在同一级可以同名
 创建一个存在的同名的目录会报错,创建一个存在的同名的文件不会报错,但是会修改3个时间
 mkdir 同时创建多个目录 ,能创建的就创建,不能创建的就报错
 touch 同时创建多个文件 ,能创建的就创建,不能创建的也不报错,但是会修改3个时间,除非没有权限才会报错或创建多个文件的时候第一个目录不存在
-p不是选项,可以放在参数前面或者后面
文件可以覆盖文件,目录不能覆盖目录,但会修改时间

# 使用一条命令,创建出下面的所有目录
/home/zls
/home/zls/test1
/home/zls/test2
/home/oldboy
/home/oldboy/test1
/tmp/oldboy
/tmp/oldgirl
/root/test/test1
/root/test/test2
/root/abc
/backup
#mkdir -pv /opt/{home/{zls/test{1,2}},oldboy/test1},tmp/old{boy,girl},root/{test/test{1,2},abc},backup}

创建文件-touch
1.创建,如果文件已存在,则修改它的`修改时间`和`访问时间`和`改变时间`,不存在则创建(不会报错)
2.必须创建在已经存在的目录中
3.创建相同文件,不会被覆盖
4.在Linux中,一切皆文件,没有后缀的区别,后缀是为了给人看的。有特例

## 显示目录结构命令-tree
树状图可以直观的反应目录的层级结构
tree -L 1 /opt/
tree -dL 1 /opt/
-L:显示目录的层级(指定层级)
-d:List directories only 只显示目录,不显示文件

复制文件或者目录命令-cp
cp ./wwwww /tmp
cp ./wwwww /tmp/zls
# 注意,上面的命令
1.如果zls存在,并且是一个目录,会将wwwww放到/tmp/zls目录下
2.如果zls不存在,那么会将wwwww放到/tmp目录下,并且改名叫zls。上个目录不存在就报错
3.如果zls存在,并且是一个文件,会将wwwww放到/tmp目录下,并且覆盖原有的zls文件内容
-a:相当于 -r -p ,既做到了递归拷贝,又保持了文件的属性

-i:如果拷贝过程中,出现重复文件名,则询问是否要覆盖
-r:递归拷贝文件 -R --recursive
-p:在拷贝文件的过程中,保持文件原有的属性
-v:显示拷贝的过程

-t:将源文件和目标,反过来
-T 源文件 目标文件(必须起个名字)
-f:强制拷贝,# 不再询问,直接覆盖



文件管理命令-mv   =剪切   
[root@zls ~]# mv zls zls1
1.zls1是否存在,如果存在,并且是个目录,则将zls文件移动到zls1目录中
2.zls1是否存在,如果不存在,则将zls文件改名为zls1
3.zls1是否存在,如果存在,并且是个文件,则会询问是否要覆盖
注意:
1.mv命令,可以直接移动目录,不需要递归,mv不会修改文件的属性
2.mv 后面可以写 n个文件,但是最后一个必须是目录
3.文件不能覆盖目录,但是可以放入目录里面,目录不能覆盖文件,并且也不能放到文件里面

-i:在移动的过程中,询问是否要覆盖(一般加到别名里,安全措施)
-f:强制移动 ,不询问直接覆盖        
-t:将源文件和目标,反过来

文件管理命令-rm
rm [选项] 文件名
-d:删除目录(空目录)=rmdir   rm -rd
-r:递归删除 -R, --recursive  -r可以删除目录
-f:force 强制删除
-i:在删除文件之前,会询问是否真的要删除(一个一个文件问)
-I:也询问,但是只问一次
-v:显示删除的过程
注意:
1.在Linux中,没有回收站,所以rm会永久删除文件
2.删除文件的时候,尽量使用 rm -f
3.如果文件或者目录不存在,也不会报错
rm -f file
rm -fr /dir
rm -f zls*  #删除家目录下以zls开头的内容
rm -f zls1*
------
rm -fr /tmp/* #删除/tmp目录下面的所有内容,但是/tmp目录本身还在
rm -fr /tmp/ #删除/tmp目录下面的所有内容,包括/tmp目录本身也会被删除
------ 区别很大

系统文件查看命令-cat
语法:cat
Usage: cat [OPTION]... [FILE]...
cat [选项] 文件名
-A:相当于-v -E -T	不显示出文件的行数

-n:查看文件并显示出文件的行数(空行也编号)

-T:以^I,表示文件中的TAB键
-t:相当于 -T

-E:以$符,标注一行的结尾
-e:相当于 -E + -v		-v	以特殊符号表示文件中的中文

-b:空行不给编号
[root@zls ~]# cat >> menu <<eof
> 1.苹果
> 2.梨
> 3.香蕉
> eof
tac 把文件反过来看

[root@oldboy /opt]# cat >>kk
f
.
q
^C
[root@oldboy /opt]# cat kk

[root@oldboy /opt]# cat kk -nte
     1	f$
     2	f$
     3	f$
     4	g$
     5	h$
     6	.$
     7	q$

[root@localhost ~]# cat <<EOF  区分大小写  (只能用<<)
> 1. apple
> 2. pear
> 3. banana
> 4. qiandao
> EOF
1. apple
2. pear
3. banana
4. qiandao


[root@localhost ~]# cat >> 1.txt <<EOF  
> 1. apple
> 2. pear
> 3. banana
> 4. qiandao
> EOF
[root@localhost ~]# cat >> 1.txt  同上

[root@localhost ~]# cat 1.txt   #号之后可以直接复制粘贴(带>)
1. apple
2. pear
3. banana
4. qiandao

[root@oldboy ~]# cat '*file*'    # cat echo 支持通配符,但是不能用引号,find可以用
cat: *file*: No such file or directory

[root@oldboy ~]# cat 0</etc/passwd
root:x:0:0:root:/root:/bin/bash



系统⽂件查看命令-more  
系统⽂件查看命令-less
语法:#less [选项] ⽂件
回⻋:按⾏往下看
空格:按⻚往下看
上下键也可以翻页

/xx		搜索内容,并⾼亮显示	取消高亮
	n	查找下一个高亮字符
	N	=shift +n	查找上一个高亮字符

gg	回到第⼀⾏,不用输入内容,直接执行
G	跳转到最后⼀⾏,不用输入内容,直接执行

冒号:指定翻⻚⾏数,:后面跟数字再按回车
:后输入10,回车		向下10行

h  帮助	q 退出帮助界面

系统⽂件查看命令-head
语法:head [选项] ⽂件
作⽤:查看⼀个⽂件的前N⾏,默认是前⼗⾏。
#显示/etc/services⽂件的前⼗⾏内容
[root@localhost ~]# head /etc/services
-n:指定显示⽂件多少⾏内容(n可以省略),-n 只能紧跟在head 后面
-10
-11
不指定⾏数,默认情况下,只显示10⾏,
`head /etc/service` = `head -n 10 /etc/service` = `head -10 /etc/service`

系统⽂件查看命令-tail
语法:tail [选项] ⽂件
作⽤:查看⼀个⽂件的后N⾏,默认是后⼗⾏
#显示/etc/services⽂件的后⼗⾏内容
[root@localhost ~]# tail /etc/services
-n:指定显示⽂件后数多少航内容(n可以省略)-n 只能紧跟在tail 后面

#follow,追踪 #⽂件 末尾
[root@localhost ~]# tail -f /var/log/messages
-f:追踪⽂件的末尾,实时查看⽇志的新内容(多用户),只能看,不能在日志里直接编辑 ,可以追加内容,ctrl+c 可以退出追踪

# -c:显示后数N个字符,(空格和换行符也算字符)不能去掉c
直接跟数字显示行
[root@oldboy ~]# tail -2 passwd
syy100:x:1110:1110::/home/syy100:/bin/bash
syy:x:1111:1111::/home/syy:/bin/bash

-F: -f --retry
tailf = tail -f
不指定⾏数,默认情况先,只显示10⾏
`tail /etc/services` = `tail -n 10 /etc/services` = `tail -10
/etc/services`
tail -f
tail -F
tailf


⽂件查找命令locate # 边界递增过滤
[root@oldboy ~]# yum provides locate	x86_64	查看命令属于哪个包
[root@oldboy ~]# #yum install -y mlocate 
	首先安装含有locate这个命令的包mlocate,然后才能用locate 这个命令查找文件名
[root@oldboy ~]# yum remove net-tools	随意移动包可以倒致命令失效
	某个命令的包装好之后,如果要用这个命令访问本地的数据库,要用updatedb手动更新数据库
[root@oldboy ~]# locate /etc/sh		查找/etc下#以sh 开头的文件名
/etc/shadow
/etc/shadow-
/etc/shells
[root@oldboy ~]# touch /etc/sho
[root@oldboy ~]# updatedb		手动更新数据库
[root@oldboy ~]# locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells
/etc/sho

[root@oldboy ~]# which + 文件		无意义
[root@oldboy ~]# which hostname
/usr/bin/hostname
[root@oldboy ~]# which hostnamectl
/usr/bin/hostnamectl
[root@oldboy ~]# which cp   查看别名
alias cp='cp -i'
	/usr/bin/cp
	
$():执⾏命令的结果,可以嵌套		x ll $(which cp)		$($(//))
``:执⾏命令的结果(反引号),不可以嵌套		x ll `which cp`
	用一个命令行来执行 多条命令
[root@oldboy ~]# rpm -qa	
[root@oldboy ~]# rpm -ql
[root@oldboy ~]# ll $(which cp)
ls: invalid option -- '''
Try 'ls --help' for more information.

# 查找命令
[root@localhost ~]# type -a ls
ls 是 `ls --color=auto' 的别名
ls 是 /usr/bin/ls
1.内建命令
[root@oldboy ~]# type cd
cd is a shell builtin	(内建命令)
[root@oldboy ~]# type -a ls
ls is aliased to `ls --color=auto'	
ls is /usr/bin/ls
[root@oldboy ~]# type -a cd		(内建)
cd is a shell builtin
cd is /usr/bin/cd
[root@oldboy ~]# type -a ping
ping is /usr/bin/ping
[root@oldboy ~]# type -a ll		(别名)不显示绝对路径
ll is aliased to `ls -l --color=auto'
2.外部命令
-a	显示所有类型#命令的绝对路径
-p	显示外部命令的绝对路径(不包含其他内容)

# 查找命令 whereis	根据文件类型查找**文件**,系统自带命令,二进制文件,man帮助文件,源代码文件
[root@localhost ~]# whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz

文件排序命令 -  sort
sort + 选项 +文件
-t	指定分隔符(单个字符),默认以空白字符为分隔符(空格键 TAB键)可以用空白字符,数字,字母为分隔符,只能指定一个分隔符
-k2	指定列,以**首字母**或者**首数字**进行排序	默认以第一列(56 455)
-nk	指定列,以首字母或者数字的大小进行排序=-n -k 不=-kn
-r	倒序排列

文件去重命令 -  uniq
-c		显示重复次数
-d		只显示重复的行
-u		只显示不重复的行

文件截取命令 -  cut
⽤法:cut 选项... ⽂件(或管道左边的标准输出)
	cut  必须指定分隔符和列
-d		指定分隔符 必须是单个字符(空格,TAB,数字,字母) #只能指定一个分隔符
剪切:分隔符必须是单个字符,#cut不能指定以 '' 为分隔符
		默认以TAB键为分隔符
-f		指定列,多个的话用逗号分割,或者连续多列(1-3)	
#-c		截取字符(单字),多个的话用逗号分割,或者连续多列(1-3)

[root@oldboy ~]# ll lll | cut -c 2-10 |tr rwx- 4210 | awk -F '' '{print $1+$2+$3$4+$5+$6$7+$8+$9}'  -F 指定分隔符的时候已经定义了变量($=) 不能用【】
 - 必须放在数字后面
[root@oldboy ~]# ll lll | cut -c 2-10 | tr 'rwx-' '4210' -必须放在数字后面
041011011
[root@oldboy ~]# ll lll | cut -c 2-10 | tr 'rwx-' '4210' | awk -F '' '{print $1+$2+$3$4+$5+$6$7+$8+$9}'   ($空格加不加都一样,加,出来空格," "也会出来空格。awk本身不认识空格)
644

字符替换命令 -  tr(不会修改文件)
[root@oldboy ~]# tr s y syy.txt		无意义
[root@oldboy ~]# tr s y < syy.txt	< :标准输入 #单独针对文件操作时,必须使用	将s替换为y
[root@oldboy ~]# tr syy yyx < passwd	单对单

[root@localhost ~]# cat info.txt
I'm zls,18 years old QQ 133411023
[root@localhost ~]# cat info.txt |tr 'QQ' 'qq'(一对一)
I'm zls,18 years old qq 133411023

tr -d s < syy.txt	删除(修改文件),删除后字符连在一起
[root@qls ~]# tr  -d "m"  <qq.txt 		#删除m这个字符(必须加重定向符,不算真正的删除)
I a nae  is student QQ is,1238376584

文件统计命令 -  wc
[root@www ~]# wc [-lwm] +文件    :输出信息依次是:行数 字数 字节数 文件名称
选项与参数:
-l  :显示一个文件的行数;= cat -n	= grep -n '.*' 
-w  :统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串
-m  :显示一个文件的字符数;这个标志不能与 -c 标志一起使用
-c  :显示一个文件的字节数,一个制表符也就算一个字符
-L  : 显示一个文件中的最长行的长度(或字符数)  当使用 -L时,TAB制表符算7个字符 不把换行符计算在内,#统计脚本的长度
[rocrocket@rocrocket programming]$ cat wc1.txt
1 2
34 5
你好
[rocrocket@rocrocket programming]$ wc -c wc1.txt
16 wc1.txt 
[rocrocket@rocrocket programming]$ wc -m wc1.txt
12 wc1.txt 
[rocrocket@rocrocket programming]$ wc -l wc1.txt
3 wc1.txt 
[rocrocket@rocrocket programming]$ wc -L wc1.txt
4 wc1.txt 
[rocrocket@rocrocket programming]$ wc -w wc1.txt
5 wc1.txt
每行结尾的换行符也算一个字符,空格也算一个字符。
#
由于采用UTF-8编码,所以一个汉字在这里被转换为3字节,所以 wc -c显示的结果是16,即“第一行的4个字节+第二行的5个字节+第三行的7个字节”=4+5+7=16。
 字节 :汉=3个字节 一个数字=1个字节  一个空格=1个字节  一个换行符=1个字节
而当使用 -m选项时,一个汉字就作为一个字符计算,所以是4+5+3=12。
 字符 :汉=1个字符 一个数字=1个字符  一个空格=1个字符  一个换行符=1个字符
当使用 -L时,是给出最长行的长度(字符),第二行最长,有4个字符长。(#显然是不把换行符计算在内)
使用 -w是计算字数(单词数),一个字是一个word,所以“34”表示一个word,一个“你好”表示一个word(我试过了,当中文是连在一起的,不管多少个,在计算字数word时,只有一个),因此2+2+1=5。
 单词 : "34"=1个单词 “3”=1个单词  连在一起的数字=1个单词
#插孔说说tab制表符,这个符号比较特殊,当使用 -L时,制表符算7个字符(这要依据一个制表符的长度而定,在我的系统中一个制表符算7个空格长度)。而当使用 -w时,制表符和空格没有两样,都作为字的间隔来看待。当用-c时,一个制表符也就算一个字符,因为它的确就只是一个字符而已。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节

stat 
[root@oldboy ~]# ll lll
-rw-r--r--. 1 root root 0 Mar 31 23:23 lll
[root@oldboy ~]# stat -c %a lll   前面的0不显示后面的0显示
644
[root@oldboy ~]# ll lll
-rw-r-----. 1 root root 0 Mar 31 23:23 lll
[root@oldboy ~]# stat -c %a lll
640

rename:
-n 先不改名,显示执行后的结果
-f 强制执行,名重复就覆盖
? 任意字符
* 表示一个或一串任意字符
【常用正则表达式符号说明】
^    匹配输入的开始位置
$    匹配输入的结尾
.    匹配除换行符外的任意字符
+    匹配前一个字符一次或多次 例如,"zo+"可以匹配"zoo",但不匹配"z"
[a-z]    表示某个范围内的字符,例如,"[a-z]"匹配"a"与"z"之间的任何一个小写字母字符。
[^m-z]    否定的字符区间。与不在指定区间内的字符匹配。

[root@localhost www]# rename 's/\.sh/\.php/' *   (分隔符 / #)(s)     
#将当前目录下.sh后缀的文件,变成.php

[root@localhost www]# rename 's/$/\.bak/' /home/www/*.php     
#给www目录下的.php加上bak后缀

[root@localhost www]# rename 's/^/bak_/' *.bin     
#给当前目录下的.bin后缀文件加上bak_前缀

[root@localhost www]# rename 's/\.bin$//' *       
#批量删除当前目录下所有文件的.bin 后缀

[root@localhost www]# rename 's/A-Z/a-z/' *      
#修改当前目录所有文件名为小写

tr 现在的  以后的  (不是真正的替换)(一对一替换)(echo xx|tr 1 2 )(只能替换眼前的)
sed 's#现在的#以后的#g' (先查找,再替换)

curl 和 wget

curl 可以curl网站URL,wget不行

-o 指定下载的路径
-s 不输出错误和进度信息 或者 2>/dev/null

[root@oldboy yum.repos.d]# curl -s https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/|grep rpm |awk '{"wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/" $2}'|bash
curl : 可以curl URL界面,或者路径下的内容
wget :下载URL路径下的rpm包

[root@oldboy yum.repos.d]# curl http://www.baidu.com/  百度的html界面
[root@oldboy yum.repos.d]# wget http://www.baidu.com/  不知道下载了什么
使用wget 爬阿里云的rpm包 <https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/>(预习)
mkdir /aliyun
cd /aliyun
curl -s https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/|awk -F '*' '{print "wget https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/"$2}'|bash

curl -s https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/ | awk -F '"' '{print "wget https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/"$2}' | bash

curl -s https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/|awk -F'"' '{print $2}'|sed -r '/^$/d;1,5d'|awk '{print "wget https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/"$0}'|bash

curl -s https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/|sed  -r 's#.*="(.*)">.*#"wget https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/"\1#g'
注意转义括号,小心贪婪匹配,尽量用sed标准格式(解决疑难杂症),sed -nr 's###gp'
-n :取消默认输出,不加-p的话就取消所有的输出
p  :打印,没有-n的时候加不加无所谓,有-n,只打印引用的内容

[root@oldboy Packages]# curl -s https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/ |awk -F '[ "]+' '/rpm/{print $3}'

[root@oldboy ~]# curl -s https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/|grep rpm |awk -F'["]' '{print "wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/ "$2}'|bash
爬mirrors.aliyun.com阿里云镜像站里的rpm包

[root@oldboy ~]# curl -s https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/ >/index.html
[root@oldboy ~]# cd /usr/share/nginx/html
[root@oldboy html]# mv /index.html .  覆盖
这样在浏览器URL输入本机ip就可以访问到“我们的”rpm 镜像库 (前端源代码)

#当前目录的下载之后的rpm包
-rw-r--r--  1 root root 1455164 May  1 02:17 index.html
-rw-r--r--  1 root root 1455164 May  1 04:13 index.html.1
-rw-r--r--  1 root root 1455164 May  1 04:13 index.html.10

scp

同一区域网的IP不同的虚拟机,使用超级复制scp,这样文件之间的的cp不需要经过windows,直接cp到同一个区域网下的不同IP的不同用户的Linux系统,第一次cp需要输入,yes,scp对象的用户密码,第二次直接输入密码
只能scp文件,不能scp目录

-r: 递归复制整个目录
-p:保留原文件的修改时间,访问时间和访问权限

echo

#用法一
[root@lb01 ~]# echo -e 12\n34 >>10.txt
[root@lb01 ~]# cat 10.txt 
12n34
[root@lb01 ~]# echo -e '12\n34' >>10.txt
[root@lb01 ~]# cat 10.txt 
12n34
12
34
#用法二
[root@lb01 ~]# echo '
> 1
> 2
> 3
> '

1
2
3

#用法三
[root@lb01 ~]# echo 1
1
[root@lb01 ~]# echo 123 1
123 1

[root@lb01 ~]# vim a.sh
#!/bin/bash
echo $a
[root@lb01 ~]# sh a.sh  # a不是一个变量,所以没有输出内容

[root@lb01 ~]# a=1
[root@lb01 ~]# sh a.sh   #命令行定义了变量,无法传递到脚本
[root@lb01 ~]# sh a.sh a  #同样不会输出内容

[root@lb01 ~]# vim a.sh
#!/bin/bash
echo $1
[root@lb01 ~]# sh a.sh a
a
[root@lb01 ~]# sh a.sh b
b
[root@lb01 ~]# !v
vim a.sh 
#!/bin/bash
echo $1
echo $2
[root@lb01 ~]# sh a.sh a   #一行输出a,一行为空
a

[root@lb01 ~]# sh a.sh b
b

[root@lb01 ~]# sh a.sh a b
a
b
[root@lb01 ~]# vim a.sh 
#!/bin/bash
echo $2
echo $1
[root@lb01 ~]# sh a.sh a b
b
a
# $N N必须是正整数,输出是有顺序的

date

[root@web02 ~]# date
Fri May  8 18:57:48 CST 2020
[root@web02 ~]# date +%F	#年月日
2020-05-08
[root@backup ~]# date +%R	#时分
21:25
[root@backup ~]# date +%T	#时分秒
21:33:05
[root@web02 ~]# date +%F-%R
2020-05-08-18:58

[root@backup ~]# date +%Y        #年
2020
[root@backup ~]# date +%m		#月
05
[root@backup ~]# date +%d		#日
08
[root@backup ~]# date +%S		#秒
43

[root@backup ~]# date +%Y-%m-%d-%H-%M-%S  #年月日时分秒
2020-05-08-21-28-20

# 这样可以设置全部时间
date -s '2008-05-23 01:01:01'
posted @ 2020-05-01 12:16  看萝卜在飘  阅读(225)  评论(0编辑  收藏  举报