大三这学期选了一门 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
yuminstall(安装软件)
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/bashread num
if [ "$num" -gt 0 ] 2>/dev/null
then
if [$ num -eq 1 ]
then
echo "$numnumber 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 "$numis a sushu"
else
echo "$num alphabet error"
exit
fi
2.如何判断一个用户输入的数字是否是回文数。
#!/bin/bashread in
res= $(echo$ in|rev)
if [ $res -eq$ in ]
then
echo "$inis a huiwenshu!"
else
echo "$in not is a huiwenshu"
fi
3.计算用户输入的数字的阶乘。
#!/bin/bashread in
sum=1
for i in $(seq 1$ in)
do
sum= $(($ sum * $i))
done
echo$ sum
4.判断一个数列是否为斐波那契数列。
#!/bin/basharr=(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/bashread 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