这是个不那么认真的linux总结,可能有一些错误
1、linux=kernel(内核)+shell(外壳)+fs(文件系统)+pro/uti/tol(应用程序)
2、ls(列出文件)
-a(列出文件包括.开头的的隐藏文件)
-l(列出文件详细信息,包括创建时间,大小等等)
内容如下:
文件属性(10个字符) 文件数 拥有者 所属group 文件大小 建档日期 文件名
-rwx--x--x 2 wd wd 808083 Nov 7 22:41 躺平
-R(列出文件包括其子子孙孙)
-r(字母逆序列出文件)
-h human为“人”的意思,这个命令意思就是显示地尽可能人性化一些。具体体现在文件或目录的大小(直接显示为某某KB或某某MB)
3、cat(对文件操作)
-n (列出文件内容,并且由1开始排序,给文件的每行都加上行号)number
-b(列出文件内容,但是空行不参与排序)blank
-s(两个空行合并为1个)space
-E(回车符被替换为$)
-T(Tab符被替换为^)
-A(-ET的效果)
cat>newFileName(创建一个文件,并输入内容,ctrl+d结束输入)
4、基本命令
ls 展示当前目录的文件列表
pwd 展示当前的工作目录
cat 展示文本文件的内容
info、man、help【xx --help】 查找相关命令的帮助文档或解析信息,从左到右信息逐渐简略
5、linux的终极形态
所有东西都是文件,要不就是进程
6、文件命名
1、不超过256个字母
2、区分大小写
3、组成为:大小写字母、数字、.(点)、_(短横杠)
4、隐藏文件由.开头
7、文件类型
- 常规文件
d 目录
l 链接
8、地址
/ 根目录 包含所有文件
~ 是用户的主目录
root用户的主目录是/root
普通用户的主目录是“/home/普通用户名”
在root用户下,~等同于/root2; 在普通用户下,~ 等同于 /home/当前的普通用户名。
如果我们建立一个用户,用户名是"xx",那么在/home目录下就有一个对应的/home/xx路径,用来存放用户的主目录。root是管理员账号,root文件夹是管理员的主目录
9、tab键的妙用
点一次可以使路径完整
点两次可以看到所有的路径可能
10、touch 创建文件
创建单个文件 touch aa.txt
创建多个文件
touch aa1 aa2 bb1 bb2 cc1 cc2
touch {aa,bb,cc}{1,2}
11、mkdir 创建目录
-p 可以连带着父亲目录也创建
12、其他命令
cp 复制
mv 移动
rm 删除 -r表示递归地处理文件,即处理该目录及其所有子目录下符合条件的文件;-f则是无提示强制删除。普通的rm是无法删除目录的。
rmdir 删除目录
13、vim编辑器
vi 编辑或新建一个编辑文件
vim 与上面一样但是功能更多
view 以只读模式开启vim
cat 阅读文本内容
14、各种模式
命令模式->插入模式 i【从当前字符前面开始】、a【从当前字符开始】、A【从当前行末尾开始】、L【从末尾行行首开始】、o【在当前行另起一行开始】、O【在当前行前面 另起一行开始】
插入->命令 Esc
命令->底行 :(冒号)
底行->命令 命令完成之后自动切换
命令模式
hjkl 左上下右
w 右一格 b左一格(一个字符串一个字符串跳)
^行首 $行尾
底行模式
:w 保存
:q 退出
:!强制
:wq!强制保存退出
:x =:wq
ZZ=:wq
:n 将光标定位到第n行
:$ 移动光标到最后一行
:set nu(number) 打开行编号
:set nonu 关闭行编号
其他:
dd 删除当前行
vim的复制黏黏:
1、选择文本
v+光标移动 (按字符选择)高亮选中所要的文本,然后进行各种操作(比如,d表示删除)。
v+选中的内容+c 更改选中的文字
2、复制:y(ank)
y 用v命令选中文本后,用y进行复制 yy 复制当前行,然后用p进行粘贴。
5yy 复制从当前行开始的5行
y_ 等同于yy
Y 等同于yy
yw 复制当前单词
y$ 从当前位置复制到行尾
y0从当前位置复制到行首
y^ 从当前位置复制到第一个非空白字符
3、粘贴:p(aste)
p(小写) 在光标位置之后粘贴
P(大写) 在光标位置之前粘贴
4、剪切 v + 方向键(hjkl)选中内容 + d 剪切 + p粘贴
15、wc 统计 行数(line)/字数(word)/字节数(character)
可以拆开得到
统计行数:wc -l
字数:wc -w
字节数:wc -c
ps:一个字符串是一个字
16、head tail
展示头n行/末尾n行
17、>
功能: cmd > file 把cmd得到的结果写入file中
注意:>> 是追加内容, > 是覆盖原有内容
18、管道 |
功能:cmd1 | cmd2 另cmd1的输出/结果作为cmd2的输入
eg:ls / | wc -w 列出根目录的所有文件再统计它的字数
19、groups 用户排列在其中
功能:可以通过设置组的级别为用户设置权限
20、文件/etc/group
内容形式为:组名:密码:组id:账号1:账号2....
21、group命令
groupadd name1 创建一个组名为name1的组
groupadd -g GID1 name1 指定组名和组id
groupdel name2 删除name2的组
groupmod 修改 -g 修改id -n 修改名字
groups name3 展示name3属于哪个组
22、文件/etc/passwd 存用户信息的文件
内容形式为:用户名:密码:用户uid:组gid:命令:路径:内核shell
eg: wu: mima : 1000 :1000 :wu :/home/wu: /bin/bash
ps:/etc/passwd 任何人可读
/etc/shadow 只有root可读,存用户密码的文件
root用户的uid为0
uid是独一无二的
系统账户的uid<1000
gid 组id
newgrp 命令可以换组
shell 程序 用户登录的时候会被执行,可用的shells在/etc/shells
用户信息和密码放在不同文件的原因是什么?
/etc/passwd文件对所有用户都是可读的,而/etc/shadow只有root可见,这种设置为了安全考虑,避免被破解密码
23、用户名/密码规则
少于8个字符
区分大小写
必须全部小写
可以有数字
不能有特殊字符
24、user命令
useradd
参数:
-c 创建账户评价
-m创建home目录
-s user's shell的路径
-g 指定默认组
-d 指定home目录
userdel
userdel -r 《username》 把home目录也删掉
usermod
-c 评论 -g组 -s shell -d home目录
passwd 《username》 为《username》设置密码
25、文件权限
有三种 :readding/writing/executing r/w/x 只读/可写/可执行
ls -l 《filename》可以查看文件的权限
26、linux怎么上网
1、输入ifconfig 检查网络接口
可以看到ens(网卡)、lo(本地网络),virbr0(虚拟网卡,这个东西需要删掉)
2、输入ifconfig virbr0 down 关掉网卡
3、输入systemctl disable libvirtd.service 关闭虚拟网卡的服务(关闭名为libvirtd.service的服务)
4、再次输入ifconfig 查看虚拟网卡还在不在
5、去到网络配置的文件 /etc/sysconfig/network-scripts/ifcfg-ens#(网卡的配置文件,这里网卡名称为ens20。 /etc/sysconfig/network-scripts/ifcfg-ens20)
6、su 切换超级用户模式
7、进入文件修改
BOOTPROTO=dhcp #获取IP地址的方式为DHCP自动分配
ONBOOT=no 改为 ONBOOT=yes
8、保存文件
9、systemctl restart network.service 重新启动网络
现在就可以ping通了,可以上网了
27、sort 按照文件名字排序文件列表
默认:空行排在最前面,空格排其次,数字在字母前面(比如 1 34 5 A a B hh)
参数:
-k《n》 指定列排序,这里指定第n列
-n 数字排序 2 11 13 要是默认的字母排序则是 11 13 2 这样排序(此时字母在数字前面)
-r 反转的字母排序
-f 忽略大小写(大写排小写前面)
-u 重复的删掉
使用:cat file.txt | sort -f
28、tr 替换字符
eg:cat file | tr ‘a-z’ ‘A-Z’ 把file中的小写替换为大写
参数:
-d 删除 删除指令字符
29、grep 过滤->正则表达式立大功
-i 大小写敏感
-v 显示没有匹配到的
正则表达式基础:
a? a可以出现一次,也可以不出现
a* a可以出现很多次,也可以不出现
a+ a要出现一次及以上
a{6} 指定a出现6次
a{2,6}a出现2次到6次之间
a{2,}a出现2次以上
(a|b) a与b都匹配
[A-Za-z0-9]匹配的内容只能取自【里面的内容】
\d 数字字符 (相当于[0-9])
\D 非数字字符
\w 单词字符(字符+数字+下换线)
\s tab+空白+换行
30、进程和线程
进程是指程序正在执行,而线程是指进程的一个段。
进程不是轻量级的,而线程是轻量级的。
一个进程需要更多的时间来终止,而线程需要更少的时间来终止。
Process需要更多的时间创建,而Thread需要更少的时间创建。
进程大多是隔离的,而线程共享内存。
进程不共享数据,线程之间共享数据。
ps 查看进程状态
参数
-e 所有进程
-f 显示进程的完整格式 format
-x 显示当前用户在所有终端下的进程。
-u 《username》 展示《username》的进程
-p 《pid》 展示《pid》的信息----pid是进程id,ppid是父进程id
-ef 展示所有进程且是完整格式的
-eH 展示进程树
查看进程的其他方式
pstree 以树的形式展示进程列表=ps -eH
top 显示最活跃(资源消耗)的进程
参数
-d n 每n秒刷新一次
快捷键
P 按照%CPU排序(CPU占用)
M 按照%MEM排序 (memory occupation 内存占用)
后台和前台进程
常规命令在前台执行
任何时候只有一个前台进程
后台启动命令 command &
关闭前台进程 Ctrl-c
暂停前台进程(放到后台) Ctrl-z
在后台列出所有进程 jobs
把第n个工作放在前台 fg n
31、at (在指定的时间执行一次命令)
shift+ctrl+d 停止task
参数
-l 展示task列表
-d # 删除task#
-c # 显示task#
请设定当前时间1分钟后清除家目录下Test目录及其下所有文件和文件夹的任务,此任务仅进行一次
[lei@localhost ~]$ at 17:31
at> rm -r Test
ps:at环境输入命令结束需要ctrl+shift+d
32、cron、crontab 自动化
cron -基于时间的作业调度服务,用于重复作业。
crontab -创建、读取、更新和删除作业计划的程序。
参数
《file》 从《file》中安装新的crontab
-l 展示所有的cron工作
-e 编辑cron工作
-r 删去所有的cron工作
格式
* * * * * command
| | | | |
| | | | +-- Day of the Week (0-6)
| | | +---- Month of the Year (1-12)
| | +------ Day of the Month (1-31)
| +-------- Hour (0-23)
+---------- Minute (0-59)
比如
# Run every Monday at 07:00.
0 7 * * 1 reboot
| | | | |
| | | | +-- Day of the Week (0-6)
| | | +---- Month of the Year (1-12)
| | +------ Day of the Month (1-31)
| +-------- Hour (0-23)
+---------- Minute (0-59)
eg
# Run every 30 minutes.
0,30 * * * * /opt/acme/bin/half-hour-check
# Run for the first 5 minutes of the hour
0-4 * * * * /opt/acme/bin/first-five-mins
使用cron来调度和自动化任务。
ps:systemctl enable crond(对应的服务) ——启动未激活的服务
设置一个每周1、3、5凌晨2:00的重启任务,并简述过程
[lei@localhost ~]$ cat my_cron 0 2 * * 1,3,5 reboot(重启)
[lei@localhost ~]$ crontab my_cron
my_cron用vim编写
33、包管理系统rpm(手动)、yum(自动)【下载包用的】
RPM (RPM Package Manager)是功能强大的包管理系统。
RPM也指RPM命令和. RPM文件格式。
RPM包由文件归档和元数据组成,包括依赖关系和安装位置等信息
yum install package_name安装所有依赖包
yum install -y package_name自动安装,不提问
remove package_name完全删除一个包及其所有依赖项
yum update package_name 将其更新到最新的稳定版本
yum list name 名称完全匹配
yum search name 搜索与名称相关的包
34、SSH 远程登录
SSH,或Secure Shell,是一种远程管理协议,允许用户通过Internet控制和修改其远程服务器。
该服务是作为未加密的Telnet的安全替代品而创建的,它使用加密技术来确保与远程服务器之间的所有通信都以加密方式进行。
ssh sever_ip(远程访问某个ip)
ssh user_name@sever_ip 以user_name的名称连接server_ip
35、shell编程
#!/bin/bash
“#!” 是一个约定的标记,它告诉系统用什么解释器来执行这个脚本,即使用哪一种Shell。#!/bin/sh是指此脚本使用/bin/sh来解释执行。
36、变量
变量名格式:不超过256个字节
区分大小写
能用字母、数字、“_”,首字母不能是数字
变量的使用:$variableName or${VariableName}
环境变量—存储系统信息
env命令查看所有环境变量
输出形式:p=$(pwd) echo ${p} 或者 p=`pwd` echo $p系统环境变量path
查看path echo $path
path的内容是由一堆目录组成的,目录之间用:隔开,且有顺序之分。
我们执行一个指令的时候,比如ls,我们可以在任何目录下执行,而不会找不到可执行文件,这是因为系统环境变量path的帮助。我们执行ls,系统会去每个path的目录下面搜索文件名为ls的可执行文件,如果有多个ls的可执行文件,那么先被搜寻到的先被执行。如果我们把ls由/bin/ls移动到/root/ls【mv
/bin/ls
/root】,这时候就不可以直接执行ls指令了,需要使用ls的绝对或相对地址。若想直接执行ls,那么就将/root加入path当中即可,【path=" p a t h " : / r o o t 】不过这样是临时的,下次再登录的时候 path":/root】不过这样是临时的,下次再登录的时候 path":/root】不过这样是临时的,下次再登录的时候path的值就会变为默认的样子了。
只读变量
定义只读变量readonly Var='hello world'
删除变量内容
unset variableName
37、字符串
单引号和双引号——'‘和"“,”"里面可以放变量,但是’'里面全部都是字符串 ${#string_name} 计算字符串长度
${string_name: m :n} 截取部分字符串 eg:“abcde”:1:3=>bcd
38、Alias 别名——为一些记不住的命令起别名,让命令容易记住
起一个新别名 alias NAME='COMMAND'
移除别名 unalias NAME
列出别名列表 alias
39、计算——加减乘除
$(( 20 + 5 ))
x=5 echo $(( x-- ))
ps:注意,数字、括号之间一定要有空格
40、-e和-d 与 条件表达式
–e 文件是否存在
–d是否为目录
others:
-s 文件是否存在且不为空
-f 文件是否存在且为常规文件
-r 文件是否可读
-w 文件是否可写
-x 文件是否可执行
用法:
[ -e date_log ] && echo ‘Y’ || echo ‘N’ Y
test -e date_log && echo ‘Y’ || echo ‘N’ Y
编写一个脚本test_rw.sh,执行时由命令行提示用户输入一个路径,检测该路径是否即可读又可写,输出检测结果(True or False)。
#!/bin/bash
read -p "please input a path: " path
if [ -r $path -a -w $path ]
then
echo True
else
echo False
fi
41、字符串操作
-z String 判断字符串是否为空
-n String 判断字符串是否不为空
string1=string2 判断string1和string2是否相等 string1!=string2 判断string是否不相等
42、表达式操作
arg1 –eq arg2 是否相等
arg1 –ne arg2 是否不相等
arg1 –lt arg2 是否小于
arg1 –le arg2 是否小于或等于
arg1 –gt arg2 是否大于
arg1 –ge arg2 是否大于或等于
eg:
[ 5 -gt 2 ] && echo Y || echo N [里面记得加空格在前面和后面]
Y
43、逻辑操作
not or and
44、if 表达式——shell编程
if [ condition-is-true ]
then
commands
elif [ condition-is-true ]
then
commands
else
commands
fi
45、shell——输入 read
格式:read -p “Prompt” var1 var2 varN
eg:read -p "Enter your name : " name
参数
-p PROMPT
从终端读取输入时,在输入前打印提示信息
-s
静默模式,输入字符不显示到屏幕,例如 login 时输入密码
-t TIMEOUT
后面跟秒数,定义输入字符的等待时间
eg:
read -t 3 -p "Enter your name : " name
read -s -p "Enter Password : " my_password
46、shell——case
eg:
#!/bin/bash
echo 'input a number between 1~4:'
read aNum
case $aNum in
1) echo 'your input is 1'
;;
2) echo 'your input is 2'
;;
3) echo ' your input is 3'
;;
4) echo ' your input is 4'
;;
*) echo 'your input is not in 1~4' ;;
esac
47、shell——array数组
格式:
array_name=(value1 value2 ... valuen)
array_name=(value1 value2 ... valuen)
创建特定长度的数组
array_name[index]=value
数组下标不一定是连续的
输出数组的某个数 ${array_name[index]}
输出数组的前面n个字节 $array_name[n]
eg:
my_array=(hello world)
echo $my_array[5]
hello[5]
输入数组所有元素
${array_name[*]}
${array_name[@]}输出数组总长度
${#array_name[@]}
${#array_name[*]}
建立一个数组,数组的每个元素都要是合法的文件名。利用该数组在家目录下创建一组文件,每个文件的名字对应数组的一个元素。(通过命令行实现,不写脚本)
[lei@localhost ~]$ my_arr=(aa bb c1.sh)
[lei@localhost ~]$ touch ${my_arr[*]}
48、shell——loop,循环
eg1:
for car in bmw ford toyota nissan
do
echo "Value of car is: $car"
done
eg2:
#!/bin/bash
echo "请输出当前目录下的各文件名称"
for f in $(ls)
do
echo $f
done
双层循环
#!/bin/bash
# A shell script to print each number five times.
for (( i = 1; i <= 5; i++ )) ### 外层循环 ###
do
for (( j = 1 ; j <= 5; j++ )) ### 内衬循环 ###
do
echo "$i "
done
echo "" ####输出新的一行 ###
done
while循环
#!/bin/bash
# set n to 1
n=1
#n小于或等于5
while [ $n -le 5 ]
do
echo "Welcome $n times."
n=$(( n+1 ))
done
或
#!/bin/bash
n=1
while (( $n <= 5 ))
do
echo "Welcome $n times."
n=$(( n+1 ))
done
until循环(初始n=0,while是当n<2时继续循环 0,1 until是直到n>=2才退出 0,1)
#!/bin/bash
i=1
until [ $i -gt 6 ]
do
echo "Welcome $i times."
i=$(( i+1 ))
done
49、shell——执行sh文件时可以输入参数
sh script.sh par1 par2 par3
别名:
$0 “script.sh” 文件名称$1 "par1“ 第一个参数
$2 "par2“ 第二个参数
$3 "par3“ 第三个参数
$n 第n个参数
$# 参数数量
$* 所有的参数
$@ 所有的参数
编写一个脚本creat_dirs.sh,执行时传入2个或以上的参数,每个参数作为命名主体。此脚本用来生成一组目录,其命名规则为:主体_序列号_总文件数
例:参数为 Fna Fnb Fnc,则生成3个目录,其文件名分别为Fna_1_3 Fnb_2_3 Fnc_3_3
#!/bin/bash
i=1
for name in $*#$*是所有的参数,也可以是$@
do
str=$name'_'$i'_'$#
echo $str
mkdir $str
((i++))
done
编写一个脚本get_smallest.sh,执行时参数为多个整数,运行后显示其中最小的一个。
[lei@localhost ~]$ sh get_smallest.sh 1 -2 4 15
the smallest argument is: -2
[lei@localhost ~]$ cat get_smallest.sh
#! /bin/bash
smallest=$1
for item in $@
do
if [ $item -lt $smallest ]
then
smallest=$item
fi
done
echo "the smallest argument is: $smallest"
50、$*和$@的区别
"$*“可以把所有元素集合成一个字符串,而”$@"是单个字符串
(1)
for item in $* do
echo $item done
输出:
aa
bb
cc
(2)
for item in "$*"
do
echo $item
done
输出:
aa bb cc
(3)
for item in "$@"
do
echo $item
done
输出:
aa
bb
cc
(4)
#!/bin/bash
my_arr=(hello kitty)
my_arr[5]='Linux class'
for var in "${my_arr[*]}"
do
echo $var
done
echo '--------------'
for var in "${my_arr[@]}"
do
echo $var
done
echo '--------------'
for var in ${my_arr[*]}
do
echo $var
done
输出:
hello kitty Linux class
--------------
hello
kitty
Linux class
--------------
hello
kitty
Linux
class
--------------
hello
kitty
Linux
class
51、磁盘 block devices
包括硬盘(hard disk)和光盘
lsblk命令显示所有的磁盘
fdisk -l | grep disk列出所有的硬盘
/dev/为次磁盘目录
磁盘分区(partition)
三大分区MBR——主要(最多4个),扩展(最多1个),逻辑(可以有很多,包含在扩展中),主要+扩展不能超过4个。
命名:磁盘名称+数字(primary 1-4 ,extended 1-4 ,logical 5-)
展示磁盘分区 fdisk -l 【PhysicalPath】(物理地址,在硬盘上的文件的位置,如D:\html\a.html)
扇区,硬盘中最小的可访问单元 创建分区:fdisk 【PhysicalPath】
其中的命令
m 帮助
p 打印分区表n 添加新分区
d 删除分区
q 退出且不保存
w 将表写入磁盘并退出
最后一个扇区使用默认意味着将所有剩余空间分配给该分区。
格式化分区
man fs查看文件系统信息
mkfs.【fsname】 【PartitionPath 】格式化分区
52、帮助手册(manual)
man
eg:man ls /man vim
参数: -k 【str】模糊搜索str
类似:
whatis
whatis str相当于man -k str,但是结果更少
help 很方便,但是不如man强大
53、文件的创建和权限
文件的主人默认是创建者,可以用命令chown修改
eg:
chown newuser file
chown newuser:newgroup file
chmod(改权限)
文件的三种权限:r - read w - write x - execute
脚本script.sh至少可以通过哪两种方式被执行,并写出具体命令
其一,可用sh script.sh直接执行
其二,可用chmod +x
script.sh添加执行权限,之后用./script.sh执行(注意,这个+是真实存在的)