本文的主要内容是我学习Linux时记载下来的笔记。
我学习的主要资料包括:B站UP主 Python地中海 的教学视频 2周光速Linux入门,共189集,持续更新中,喜欢的就和我交个朋友吧!、阿里云开发者学堂、公众号 Linux就该这么学相关文章。
感谢UP主的分享!
文章目录
常见概念
环境变量
输出环境变量echo $PATH
注意:PATH一定要大写,这个变量是由一大堆的目录组成的,分隔符是“:”\
- 小实验–定义一个变量
- 执行命令
name=hello world
- 执行命令
echo name
绝对路径与相对路径
- 绝对路径
从根目录开始寻找就是绝对路径写法/home/test/study/filetest
- 相对路径
只要不是从根目录开始寻找就是相对路径./study/filetest
重定向符号
重定向的意思是将数据传送到其他地方
例如:
- 将文件study1中的文本内容复制到文件study2,那么我们可以执行命令
cat study1 > ./study2
其中,>代表以覆盖的形式传送(也就是说,哪怕命令执行100次,该文件中仍然只有一版内容),>>以追加的形式传送(命令执行几次,文本内容就有几版) - 将文件study1中的文本内容发送给cat命令读取,那么我们可以执行命令
cat < study1
- 将文本内容拆分成多行,
xargs -n 3 < study
将study文件中的内容拆分成三个字符一行、 - 在指定文件中写入内容
cat >> 指定文件名 << EOF 写入内容 EOF
常用快捷键
- 取消当前操作
ctrl+c
- 清空屏幕内容
ctrl+l
- 退出当前用户
ctrl+d
- 光标移动到行首
ctrl+a
- 光标移动到行尾
ctrl+e
- 删除光标到行首的内容
ctrl+u
bash
我们可以将 bash 看作是一个翻译官,一个运行在文本窗口中的命令解释器。
- 小实验:
- 执行命令
touch bash_test.sh
创建脚本文件 - 执行命令
vim bash_test.sh
, 写入touch bash_test.py echo "print('hello world')" >> bash_test.py
在脚本中写入命令去创建一个文本文件,并在此文件中写入内容 - 执行命令
sh bash_test.sh
让脚本文件生效 - 执行命令
cat nash_test.sh
检验脚本文件是否生效- 按顺序打印文件file1…file100,但排除文件编号为偶数的文件
echo file{1..100..2}
- 查询机器上的别名
alias
- 取消
rm
命令的别名unalias rm
- 恢复刚刚删除的
rm
命令的别名alias rm=rm -i
- 在用户执行
rm
命令的时候,打印提示语alias rm='echo 请谨慎使用rm命令'
- 按顺序打印文件file1…file100,但排除文件编号为偶数的文件
正则表达式
正则表达式可应用于多种语言,但在Linux环境下普通命令不能使用正则表达式,可以使用grep/awk/sed
grep
- 忽略大小写查找文本中的"root"内容
grep -i "root" filename
- 查找文本中的“root”内容,并显示行号
grep -n "root" filename
- 查找文本中的“root”内容,并统计文本中有多少行包含了该内容
grep -c "root" filename
- 查找文本中的空行,并显示空行所在的行号
grep ^$ filename -n
- 过滤空行,查找改文本中的有效信息
grep ^$ filename -v
- 过滤以#开头的注释行以及空行,输出过滤后的文本
grep '^#' -v filename | grep -v '^$'
- 忽略大小写,找出以“m”开头的所有行内容,并显示行号
grep -in '^m' filename
- 输出文本中以“.”结尾的行内容,并显示行号
grep -in '\.$' filename
注意:此处必须要加\
是因为系统容易将查找的句号.
和通配符.
混淆,因此要加上转义字符\
- 在
passwd
文件中找出所有以/bin/bash结尾的行,显示行号,且仅输出查找的bin/bashgrep -no '/bin/bash$' /etc/passwd
注意:在Linux中,所有的文件结尾都有一个$
,可以执行cat -E filename
检验。 - 在
passwd
文件中查找含有一个字母f的行内容grep -i '.f' /etc/passwd
- 贪婪匹配:输出目标文本中所有行中以字母s结尾的内容
grep '.*s' filename
- 过滤并输出目标文件中所有包含数字的内容
grep '[0-9]' filename
- 过滤并输出目标文件中所有包含小写字母的内容
grep '[a-z]' filename
- 过滤并输出目标文件中所有包含大写字母的内容
grep '[A-Z]' filename
- 过滤目标文件中的数字0-5并输出余下的内容
grep '[^0-5]' filename
’ - 找出目标文件中的
gd
或者god
,即在g与d之间,o要么不出现,要么只出现一次grep -E 'go?d filename'
- 在目标文件夹中查找以"bat"为后缀名的文件,并筛选出文件名中只含a 或 e 的文件
find 目标文件夹路径 -name ".bat" | grep -E "a|e"
- 匹配目标文本中的’y’字符,最少2次,最多4次
grep -E "y{2,4}" filename
sed
- 打印目标文件的2-4行
sed -n "2,3p" filename
- 打印目标文件的第2行,及其后延续的3行
sed -n "2,+3p" filename
- 打印目标文件中含有Nobody的行
sed -n "/Nobody/p" filename
- 删除目标文件中含有Nobody的行
sed -i "/Nobody/d" filename
- 删除目标文件中14行之后的内容
sed -i '14,$d' filename
其中,执行sed命令删除文件内容时,系统删除的是缓存内容,要想真正的删除文件中的内容需要加-i参数。此条命令使用的是单引号。 - 将目标文件中的内容进行文本替换
sed -i "s/想要替换掉的内容/用来替换的内容/g" filename
- 批量替换目标文件中的内容
sed -e "s/想要替换掉的内容/用来替换的内容/g" -e "s/想要替换掉的内容/用来替换的内容/g" filename -i
- 在目标文件第二行之前写入新内容
sed -i "2a 新内容" filename
- 在目标文件第二行之后写入新内容
sed -i "2i 新内容" filename
- 在目标文件第二行之后写入多行新内容,可以用分行符解决`sed -i “2i 新内容1\n新内容2\n新内容3 filename”
- 在目标文件中为每一行添加一行分隔符
sed -i "a --------------------" filename
- 对目标文本去头尾
ifconfig eth0 | sed "2p" -n | sed "s/^.*inet//" | sed "s/net.*$//"
或者ifconfig eth0 | sed -e "2s/^.*inet//" -n -e "2s/net.*$//p"
awk
文本格式化
- 打印目标文件的第一列内容
awk '{print $1}' filename
- 打印目标文件的第一、第三列与第五列内容
awk '{print $1,$3,$}' filename
- 打印目标文件的第一列与第三列,并在每一列前分别添加“第一列”与“第三列”这样的自定义语句
awk '{print "第一列",$1,"第三列",$3}' filename
- 打印目标文件,并在每一行前添加引导语“此行的内容是:”
awk '{print "此行的内容是:",$0}' filename
- 打印目标文件的第五行
awk 'NR==5' filename
- 打印目标文件的第二行到第五行
awk 'NR==2,NR==5' filename
- 打印目标文件的第二行到第五行并显示行号
awk 'NR==2,NR==6 {print NR, $0}' filename
- 打印目标文件的第一行,倒数第二行与倒数第三行`awk ‘{print $1, $(NF-1), $(NF-2)}’ filename
- 打印目标文件第二列的第二行到第六行内容
awk 'NR==2,NR==6{print $2}' filename
分隔符
- 以“:”为分隔符,取出
/etc/passwd
文件中的第一列awk -F ":" '{print $1}' /etc/passwd
或者awk -v FS=":" '{print $1,$NF}' /etc/passwd
- 设置制表符为自定义分割符,输出目标文本的第一列,第三列和第五列
awk -F ":" -v OFS="\t" '{print $1,$3,$5}' filename
变量
对于awk命令来说,变量分为自定义变量与内置变量两种,内置变量的含义可以参照下表:
内置变量 | 解释 |
---|---|
FS | 输入字段分隔符,默认为空白字符 |
OFS | 输出字段分隔符,默认为空白字符 |
RS | 输入记录分隔符(输入换行符),指定输入时的换行符 |
ORS | 输出记录分隔符(输出换行符),输出时用指定符号代替换行符 |
NF | Number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量。不用添加$符号 |
NR | 行号,当前处理的文本行的行号。不用添加$符号 |
FNR | 各文件分别计数的行号 |
FILENAME | 当前文件名 |
ARGC | 命令行参数的个数 |
ARGV | 数组,保存的是命令行所给定的各参数 |
- 以:为分隔符,计算并输出目标文件的总行数与总列数
awk -F ":" '{print NR, NF}' filename
- 自定义“:”为分行符,打印目标文件的内容与行号
awk -v RS=":" '{print NR, $0}' filename
- 自定义“—”为分隔符,打印目标文件的内容
awk -v ORS="---" '{print NR, $0}' filename
- 显示awk正在处理文件的名字并打印出目标文件的内容
awk '{print FILENAME, $0}' filename
- 自定义变量"ANSER=YES"
awk -v ANSWER=YES 'BEGIN{print "Do you lile Linux", ANSWER}'
- 引用shell变量
- 执行命令定义变量
myname=Podman
- 执行命令检验自定义shell变量是否生效
echo $myname
- 执行命令引用shell变量
awk -v awk_name=$myname 'BEGIN{print awk_name}'
格式化输出
- 将目标文本中的参数格式化输出
awk 'BEGIN{printf "%d\n%d\n%d\n", 1,2,3}'
- 将目标文本的内容按照“第一列:”这样的格式输出
awk '{printf "第一列: %s 第二列:%s 第三列: %s\n", $1,$2,$3}' filename'
awk模式
常用命令
crond
cron:定时任务的名字
crond:定时任务进程名
crontab:管理定时任务命令
Linux系统启动后,cron软件便会启动,对应的进程名字叫做corn,默认是定期(每分钟检查一次)检查系统中是否由需要执行的任务计划,如果有,则按计划进行,就好比我们平时用户的闹钟。
corn定时任务默认最快的频率是每分钟执行一次,因此,若是需要设置以秒为单位的计划任务则需要编写Shell脚本。
- 一分钟后在tmp路径下创建一个txt文件
- 执行命令
at now + 1min
设置定时时间 - 按提示执行命令
touch /tmp/test_at.txt
创建文件
- 执行命令
mailx
MTA(mail Transport Agent)
MUA(Mail User Agent)
mkdir
- 一次性创建多个文件夹
mkdir {文件名1,文件名2,文件名3,... }
- 递归创建文件夹
mkdir -p ./文件夹1/文件夹2/文件夹3/
- 依次创建100个文件夹
mkdir 文件名{1 .. 100}
touch
touch有两个用法:
- 创建普通文件
- 修改文件的时间
- 创建普通文件
touch 文件名
一次性创建100个普通文件touch 文件名{1..100}
或者touch 文件名{a..z}
- 修改文件的时间
- 将文件时间默认修改为当前的时间
touch 文件名
- 将文件时间修改为指定的时间
- 执行
touch -t 指定时间 文件名
命令修改时间 - 执行
ls -l --full-time
查看是否修改成功
- 执行
- 将文件时间默认修改为当前的时间
cp
- 复制普通文件
cp 被复制文件名 复制文件名
- 复制普通文件,将副本重新命名,并将之放置在指定文件文件夹中
cp 被复制文件 文件夹/新文件名
- 一次性复制多个文件夹放入指定文件夹中
cp 被复制文件1 被复制文件2 指定文件夹
- 复制文件夹
cp -r 被复制文件夹 复制的文件夹
其中,-r参数指的是递归式复制文件夹。由于文件夹内有多个文件,所以普通的复制命令已经不能满足题目要求,我们必须加上-r参数才能复制成功。 - 复制文件,并保持所有属性不变
cp -p 被复制文件 复制出的文件
- 复制软链接,并保持链接的属性不变
cp -d 被复制软连接 复制出的软连接
- 复制文件以代替当前已存在的文件,覆盖之前出现提示
cp -i 被复制文件 复制出的文件
注:哪怕不添加参数-i,我们在执行复制命令时也会发现系统会显示询问提示,这是因为Linux系统自带Alias(别名)功能,而在此功能中,cp=cp -i
cat
cat -n 文件名
读取该文件内容时,标识出每一行的行号
chattr
- 将文件的权限修改为,只能追加写入内容而不能使用vim写入内容,不能删除文件
chattr +a filename
- 将文件的权限修改为,操作者无权对其改名、删除、修改内容
chttr -i filename
- 列出文件的特殊权限
lsattr filename
- 去掉此权限
chattr -a filename
chpasswd
批量修改用户密码
- 执行命令
chpasswd
并按下回车键,进入密码输入模式 - 以“username:passwd”的格式输入新密码
- 新密码输入完毕之后按 enter、ctrl+d完成密码修改过程
chmod
- 更改文件权限
chmod 777 filename
- 一次性将文件属性修改为,所有属主与属组都只能读取
chmod a=r filename
或者chmod 444 filename
注意,如果执行的命令是
chmod 5 filename
那么,系统会将此处的5
默认为005
chown
- 更改文件的新属主
chown newoner filename/dirname
或者chown ownername filename
- 修改文件的用户组
chown :groupname filename
- 一次性修改文件的属主与属组
chown ownername:groupname filename
- 递归修改某文件夹中所有文件的属主和属组
chown -R ownername:groupname dirname/*
cut
gzip
- 对当前的所有txt文件进行gzip压缩
gzip ./*.txt
- gzip不能直接压缩文件夹,需要打成tar包再压缩
groupadd
- 创建用户组
groupadd 群组名
history
- 列出所有你使用过的命令
history
last
- 查询截至目前登录过系统的用户信息
last
lastlog
- 查询系统中所有用户最近一次登录信息
lastlog
mv
- 把当前的文件移动到另一个文件夹
mv 被移动的文件夹 目标文件夹
- 把多个文件移动到另一个文件夹,例如,把所有以study开头的文件名都移动到当前的test文件夹中去
mv study* ./test/
- 重命名文件
mv 原文件名 新文件名
- 设置一种机制,如果新文件名已经存在,那么在重命名覆盖前系统自动询问是否覆盖
mv -i 原文件名 新文件名
。但是,-i参数在这里其实是无关紧要的,因为mv 命令的别名就是mv -i。 - 强制性覆盖,系统不再询问,直接加-f参数即可
passwd
- 修改用户密码
passwd username
- 查看用户密码
cat /etc/shadow | grep -w username
rm
- 删除普通文件
rm 删除文件名
,执行此命令时会询问 - 删除多个文件,直接写入多个名字,空格分隔就好
rm 文件1 文件2
- 删除文件夹
rm -r 文件夹名字
- 删除空文件夹
rm -d 空文件夹名字
- 强制删除当前目录下的所有文件和文件夹
rm -rf ./*
注意:执行此命令时,一定要仔细、严谨 - 显示删除的过程
rm -rv 文件夹名
rpm
使用rpm命令安装软件时,需要解决该软件的各项依赖关系,因此在实际应用中我们更多地执行yum
命令。
sort
su
- 切换用户,保持环境变量不变
su username
- 切换用户,替换环境变量
su - username
sudo
执行命令发现权限不够的时候,可以使用sudo
切换到其他用户来获取权限,此时默认用户为root。但前提条件是已经在/etc/sudoers文件中写入了信息。
tar
tar命令可以在对多个文件进行压缩(将打完年间压缩成小文件)、打包(将一大堆文件或目录汇总成一个整体)、解包。
- 对tmp下的所有内容打包,生成file1
tar -cvf file1 /tmp/
- 拆开file1
tar -xvf file1 ./
- 对当前目录下的所有文件进行打包并压缩
tar -zcvf 打包的文件.tar.gz ./*
- 从当前的压缩包中提取出指定文件
tar -zxvf 压缩文件.tar.gz ./想要提取的文件名
- 将压缩包解压至指定文件夹
tar -zxvf 压缩文件 -C 指定的文件夹
- 排除文件的解压缩方式
tar -zxvf 压缩文件 --exclude 被排除的文件
umask
root用户创建文件的最大权限是666,创建文件夹的最大权限是777。执行
umask
命令可以查看遮罩码。
useradd
- 创建普通用户
useradd username
#创建用户的同时,会创建一样的用户组 - 查看刚刚创建的用户信息
ls -l /home | grep username
- 查看刚刚创建用户的bash.profile文件
ls /home/username/ -a
#bash.profile文件是用户个人环境配置文件,当我们需要给单个用户定义一些特别功能(如希望该用户一开机就能加载某些变量)的时候,我们可以再此文件中写入 - 查看用户信息
id username
- 新建用户并指定用户默认所属的群组
useradd username -g groupname
- 新建用户并指定用户所属的附加组
useradd username -G groupname
- 新建用户并指定用户的shell
useradd -s /bin/bash
- 新建用户并指定用户的标签信息
useradd -c 标签信息
- 新建用户并修改用户的有效时间
useradd -4 time
- 新建用户并修改用户的登录目录
useradd -d 指定目录
userdel
- 强制删除用户
userdel -f username
- 删除与用户有关的文件
userdel -r username
usermod
- 修改现有用户的uid
usermod -u 想要修改的uid
vim
vim快捷键
输入u,撤销上一步的操作
输入yy,复制光标所在行
输入4yy,复制4行内容
输入p,打印粘贴的内容
输入/,查找内容
输入C,删除光标所在位置到行尾的所有内容,且进入编辑模式
输入o,在当前所在行的下一行进行内容编辑
输入O,在当前行的上一行进行内容编辑
批量删除:
- 按住ctrl+v进入可视块模式
- 用上下左右命令,选择你操作的块
- 选中块后,输入d,删除块内容
vim常见问题
文件交换问题
w
查询当前已登录的用户.
wget
- 准备工作: 执行命令
wget
检测计算器上是否存在此命令。若机器显示没有,那么执行yum install wget -y
下载安装该命令。
yum
yum是一种可自动化解决依赖关系的软件包管理器。与rpm相比,
- 安装wget命令
yum install wget -y
- 按提示指定yum仓库的网站地址(可登录https://developer.aliyun.com/mirror/下载epel与CentOS-Base.repo)
who
功能与w
一样,但显示结果更加详细
whoami
查询当前登录的用户
zip
压缩文件zip 压缩包名字 要压缩的文件
解压缩文件unzip 压缩包