大三这学期选了一门 Linux 操作系统,虽然之前学过一些,但是不够系统,以下简单整理了一下常用的一些命令。
一、初识 Linux
发行版本 Ubuntu debian deepin CentOS red-hat manjaro mint
文件系统默认 EXT4
默认启动方式 /etc/inittab
man 命令 man 5 inittab(查看 inittab 文档)
Info 命令 info wget (查看 vi 的帮助文档)
--help 命令 mkdir --help(查看对应的帮助文档)
Linux 的 5 种文件类型:普通文件、目录文件、链接文件、设备文件、管道文件
常用的目录含义:
/proc 当前系统的状态
/dev 所有设备文件
/boot 内核镜像和启动相关的文件
/etc 绝大部分配置文件
/bin 启动时需要的普通程序
/sbin 启动时需要的系统程序
/usr 除了上面的外,几乎其他所有文件都在这
二、文件管理与常用命令
显示文件命令:
cat
- cat -A readme.txt(显示文件内容及特殊字符)
- cat test1 test2 > test3(两个文件内容合并)
tac 将文件反向输出,与 cat 相反
more
- 终端底部输入 --more-- 显示百分比
- more -dc test.c(显示内容前清屏,并显示百分比)
less 与 more 类似,但可以向前向后翻阅文件
head
- head -3 test.c(显示前三行)
tail
- +num 第 num 行开始 -num 距离文件尾 有几行
- tail -4 test.c(最后四行)
文件查询:
grep
- grep “test file” stdc.h(在 stdc.h 中搜索 test file)
- grep data*(在当前所有文件中搜索含有 data 的行)
- grep stdio.h*.c(在 C 语言文件中搜索 stdio.h)
find
- find -name ‘tmp’ -o -name ‘Mina*’(查询文件名为 tmp 或者匹配 Mina*的文件)
locate 比 find 快,但是依赖于数据库
文本处理:
sort
- sort test.txt(对文件内容排序)
- sort +1-2 test.txt(对第二个字段作为排序关键字进行排序)
uniq
- uniq -u test.txt(显示不重复的行)
- uniq -u +1 -1 test.txt(显示不重复的行,从第 2 个字段的第 2 个字符)
wc
- wc -lcw README(统计文件中的行数、字节数、字数)
comm
- comm -23 app.c app1.c(显示第一个文件中出现、而不在第二个文件中的内容)
cp
- cp exam1.c /usr/wang/test.c(将 exam.c 复制到/usr/wang 下并重命名)
- cp -r /usr/xu /usr/liu(将目录的所有文件复制到/usr/liu)
mv
- mv /usr/xu/ .(将/usr/xu 所有文件移至当前目录)
- mv wch.txt wjz.txt(将 wch.txt 文件重命名为 wjz.txt)
rm(删除文件或目录(-r))
- rm -rf /tmp/wang(删除目录的所有文件)
ln(硬链接、符号链接 //符号链接类似于快捷方式)
- ln /root/dir/file.txt ./file_1(为 file.txt 建立硬链接)
- ln -s /root/dir/file.txt ./file_1(为 file.txt 建立符号链接,需加上-s)
目录操作:
- mkdir -m 700 ./dir(创建权限为 700 的目录)
- rmkdir dir(等同于 rm -rf dir)
- pwd(显示当前路径)
- ls -l(长格式显示)
权限(利用自己的语言叙述)
- 每个文件可分为三种不同的权限:read 代表只读、write 代表写、x 代表可执行。权限分三组:文件属主,属主同组的用户,其他用户
改变用户权限
chown 用来改变文件或目录的属主和属组
- chown wang test.c(把文件 test.c 所有者改为 wang)
- chown -R wang.user1 /his(将/his 的所有文件所有者改为 wang,属组改为 user1)
chgrp
- chgrp user1 test.txt(改变 test.txt 的所属组为 user1)
chmod
- -u(所有者) -g(同组) -o(其他用户)
- chmod ug+w, o+x text(所有者和同组写权限、其他用户删除执行权限)
umask(了解即可)创建文件的默认权限
- umask(查看)
- umask 0023(修改)
文件打包和压缩
bzip
- bzip2 man.config(压缩 man.config)
- bzcat man.config.bz2(读取压缩文件内容)
- bzip2 -d man.config.bz2(解压缩)
- bzip2 -9 -c man.config > man.config.bz2 或者 bzip2 -9 -k man.config(使用最佳压缩比,并保留原文件)
tar(文件归档)
- tar -jcvf hello.tar.gz hello.bak(将 hello.bak 压缩为 hello.tar.gz)
三、用户与用户组管理
- /etc/passwd(存放用户资料)
- uid(用户 id)
- shadow(影子文件-不可逆的加密算法、root 可读)
- group(GID 组 id)
- gshadow(影子文件)
useradd: 添加用户
- useradd -u 3000 -r jone -g user1 -d /home/jone(创建一个 uid 为 3000,用户名为 jone,组为 user1,目录为/home/jone)
passmd: 设置密码
- passwd jone
usermod: 修改用户信息
- usermod -g user2 -u 5000 jone(将 jone 组修改位 user2,UID 修改为 5000)
userdel:删除用户
- userdel jone(删除用户)
使用 root 用户如何给一个组加成员
useradd -g user1 -r jone
passwd jone
四、软件包管理
RPM(依赖性、拓展格式)
- 依赖性:RPM 软件包可能依赖于其他软件包,因此要求安装特定的软件包后才能正常安装该软件包。
- 扩展格式:RPM 包以.rpm 作为文件的后缀名。 名称格式为:软件名称-版本-运行硬件平台-扩展名。如下:apache-1.3.23-11.i386.rpm
yum install(安装软件)
yum search name(查找软件包)
yum install name(安装软件包)
yum update(升级软件包)
yum remove name(卸载软件包)
五、磁盘管理
挂载命令:mount
- mount -t vfat /dev/hda1 /mnt/usb_disk(挂载一个 FAT32 的 USB)
查看 mount
- fdisk -l(查看分区情况)
- df(查看磁盘使用情况)(了解即可)
格式化:mkfs -t type device [ block_size ]
- mkfs -t vfat /dev/sda1(把 dev/sda1 格式化)
磁盘配额
- edquota -u user1
- 按用户限制:占用磁盘大小,所有文件的数量
六、文本编辑器
vi 命令行模式、文本输入模式、末行模式
三种模式的切换
- 从命令行进入文本输入模式:输入插入 i、附加 a 等
- 返回到命令行模式:Esc
- 命令模式下输入”:”,切换到末行模式
显示行号:set number(末行模式下输入)
A(光标移动到行末尾) I(行最前面) o(往下移一行)
dd(删除光标所在的整行)5dd(往下删除 5 行) 5G(去第五行)
:w(写):q(退出到 shell)
七、进程管理
三个命令
- ps -aux(看所有进程)
- w(看系统启动时间、多少用户、负载情况)
- top 守护进程(后台进程),在一个命令后加上 & 符号,就可以让该命令进入后台运行,成为后台进程。top &
crond: 创建周期性执行命令(逗号隔开表示不连续)
- cat /etc/crontab
- 00 15 * * 1,3,5 shutdown -r +5(每周一、三、五的下午三点,重启系统)
- 10,40 * * * * /user1/calculate(每小时的 10 分、40 分,执行/user1/calculate)
- crontab -r(删除所有)
- crontab -e(删除某一条、编辑)
八、shell 编程基础
输入重定向:cat < dir.txt
输出重定向(> >>):ls -l > dir.txt(覆盖方式) ls -l >> dir.txt(附加方式)
管道 |(一个命令的输出作为另一个命令的输入)
管道符 $(表示变量替换)
- “(双引号,除特殊字符外,都是普通字符)
- ‘(单引号,都是普通字符)
- `(倒引号,解释为命令行,输出结果取代该符号)
- &#(命令行参数的个数)
- $n(第 n 个参数)
- $0(当前程序的名称)
- $?(前一个命令或函数的返回码)
- $*(以“参数 1 参数 2...”的形式保存所有参数)
- $@(以”参数 1 “ ”参数 2...”的形式保存所有参数)
$$
(进程 ID)- $!(上一个命令的 PID)
If/else 结构
If [ $# -eq 0 ] ;
then
echo “hello world!”
elif [$ # -eq 1 ] ;
then
echo “***”
else
echo “***”
fi
for 循环
for fruit in “apple” “pear” “orange”;
do
echo $fruit;
done
for a in ‘seq 1 9’
do
echo$ a
done
while 循环
I=1
sum=0
while [ $i -le 100 ];
do
sum=$ [ $sum+$ i]
i= $[$ i+1]
done
echo $sum
进行数值运算方式:
- let(用于执行一个或多个表达式,如 let a=5+4)
- expr(是一个手工命令行计数器,如计算字符串长度:expr length “this is a test”,第一个字符串的位置:expr index "sarasara" a)
- read(将用户的输入读入 str:read -p “please input a word” str)
运行 shell 脚本
chmod 755 /root/hello.sh
bash bash hello.sh
shell 程序:
1.如何判断一个用户输入的数字是否为素数。(判断用户输入是否正确,如果不正确则提示消息并退出,如果正确则判断出是否为素数)
#!/bin/bash
read num
if [ " $num" -gt 0 ] 2>/dev/null
then
if [$ num -eq 1 ]
then
echo " $num number error"
exit
fi
count=0
for n in$ (seq 2 $(($ num-1)))
do
if [ $((num%n)) -eq 0 ]
then
echo "$ num not is a sushu"
exit
fi
done
echo " $num is a sushu"
else
echo "$ num alphabet error"
exit
fi
2.如何判断一个用户输入的数字是否是回文数。
#!/bin/bash
read in
res= $(echo$ in|rev)
if [ $res -eq$ in ]
then
echo " $in is a huiwenshu!"
else
echo "$ in not is a huiwenshu"
fi
3.计算用户输入的数字的阶乘。
#!/bin/bash
read in
sum=1
for i in $(seq 1$ in)
do
sum= $(($ sum * $i))
done
echo$ sum
4.判断一个数列是否为斐波那契数列。
#!/bin/bash
arr=(1 1 2 3 5 9)
len= ${#arr[@]}
fb[0]=1
fb[1]=1
for i in$ (seq 2 $(($ len-1)))
do
fb[ $i]=$ (( ${fb[$ i-2]} + ${fb[$ i-1]}))
done
for i in $(seq 0$ (( $len-1)))
do
if [$ {arr[ $i]} -ne$ {fb[ $i]} ]
then
echo 'NO'
exit
fi
done
echo 'YES'
5.求一个斐波那契数列。
#!/bin/bash
read in
if [$ in -eq 1 ]
then
echo 1
exit
fi
arr[0]=1
arr[1]=1
for i in $(seq 2$ (( $in-1)))
do
arr[$ i]= $(($ {arr[ $i-2]} +$ {arr[ $i-1]}))
done
for i in$ {arr[@]}
do
echo $i
done