[BUAA-OS]Lab0
Hello Linux!
Hello Linux围绕Linux基础操作,Linux下的开发工具,Linux操作补充,Shell Script四个部分展开
[toc]
Linux基础操作
ls
:1
2
3
4ls [选项] [文件]
选项:
-a 显示包括隐藏项目在内的所有项目
-l 列出文件详细信息,每行一个文件touch
1
touch [选项] [文件名] 创建新文件或更新现有文件时间戳
mkdir
和rmdir
1
2mkdir [选项] 目录名 创建新文件夹/目录
rmdir [选项] 目录名 删除空文件夹/空目录pwd
1
pwd 查看当前绝对路径 一般从/home开始显示
cd
1
cd [选项] 目录名 跳转到指定目录
rm
1
2
3
4
5rm [选项] 文件名
选项:
-r 递归删除目录及其内容,删除一个非空目录必须加-r
-f 强制删除不提示确认
-i 交互式(即总是会询问用户是否确定删除)使用 rm 命令要格外小心,因为一旦删除了一个文件,就无法再恢复它。一些用户 会在家目录下建一个类似回收站的目录,如果要使用rm命令,先把要删除的文件 移到这个目录里,然后再进行rm,一定时间之后再对回收站里的文件进行删除。
1
rm [选项] *.扩展名
使用该指令可以删除当前目录下所有具有指定拓展名的文件。若要避免误删可加上
-i
选项进行交互式确认。cp
1
2
3cp [选项] 源文件 目录
选项:
-r 递归复制目录及其子目录的所有内容1
2cp file1.txt file2.txt # 将 file1.txt 复制到当前目录下并命名为 file2.txt
cp file1.txt file2.txt dest/ # 将file1.txt file2.txt 复制到dest/下 dest 为当前目录下某一相对路径 或 绝对路径mv
1
mv [选项] 源文件 目录
1
2
3mv file1.txt file2.txt dest/ # 将file1.txt 和 file2.txt移动到dest/下
mv oldname.txt newname.txt # 重命名
mv source_dir destination_dir/ # 将source_dir目录移动到destination_dir目录下常用快捷键:
Ctrl + C
:终止当前程序执行Ctrl + Z
:挂起当前程序Ctrl + D
:终止输入Ctrl + L
:清屏
Ctrl+Z
挂起程序后会显示该程序挂起编号,若想要恢复该程序可以使用fg [job_spec]
,job_spec
即为挂起编号,不输入时默认为最近挂起进程。
而如果你写了一个等到识别到EOF
才停止的程序,你就需要输入Ctrl+D
来当作输入了一个EOF
。
Linux下的开发工具
GCC(GNU Compiler Collection)
gcc
(GNU project C and C++ compiler)是一款著名的C语言编译器。
1 | gcc [选项] ... [参数] ... |
1 | gcc test.c testfun.c -o test # 这里 -o 表示将gcc编译后得到的可执行文件重命名 |
1 | gcc [其他选项] -I<目录路径> 源文件 -o 可执行文件 |
make工具
make工具一般用于维护软件开发的工程项目,它可以根据时间戳自动判断项目的哪些部分需要重新编译,每次只重编译必要的部分。make工具会读取Makefile文件,并根据Makefile的内容来执行相应的编译操作。
1 | target: dependencies |
Linux操作补充
find
1
find [搜索路径] [表达式] # 搜索路径默认是当前目录 .
1
2find . -name "*.txt" # 查找当前目录下所有扩展名为.txt的文件
find . -iname "*.txt" # 不区分大小写地查找当前目录下所有扩展名为.txt的文件在上述例子中,
-name
表示按照文件名精确查找。支持使用通配符*
(匹配任意多个字符) 和?
(匹配单个字符)。1
2find . -name "*.log" -print # 将找到的文件或目录的名称打印到标准输出
find . -name "*.bak" -exec rm {} \; # 删除当前目录下所有扩展名为 .bak 的文件:在上述例子中,
-exec
表示找到文件执行指定命令。命令以{}
作为当前找到的文件的占位符,以\;
作为命令结束标志。grep
1
grep [选项] 模式 [文件...]
其中模式是指定要搜索的字符串或者正则表达式。
文件是指定在那些文件中搜索,如果不指定,grep会从标准输入读取数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14匹配控制选项
grep -i "hello" file.txt # -i 忽略大小写
grep -w "cat" file.txt # -w 只匹配完整单词
grep -x "This is a test." file.txt # -x 只匹配完整的行
输出控制选项
grep -n "error" log.txt # -n 在匹配输出时显示行号
grep -v "apple" file.txt # -v 反转匹配 即输出不包含指定模式的行
grep -c "warning" log.txt # -c 只输出匹配的行数,而不显示具体的匹配内容
文件搜索选项
grep -r "password" documents/ # -r 递归搜索指定目录及其子目录下所有文件diff
1
diff [选项] 文件1 文件2
1
2
3
4
5
6
7
8
9
10输出格式选项
diff -u file1.txt file2.txt # -u 以统一格式输出差异 用+表示新增的行,-表示删除的行
diff -y file1.txt file2.txt # -y 以并排格式输出差异,将两个文件的内容并列显示,中间用竖线分隔
比较规则选项
diff -i case1.txt case2.txt # -i 不区分大小写地比较
diff -w case1.txt case2.txt # -w 不考虑空白符地比较
目录比较选项
diff -r dir1 dir2 # -r 递归比较目录及其子目录下的所有文件sed
sed
(stream editor)是一个强大的流编辑器,用于对文本进行过滤和转换。1
sed [选项] 编辑命令 文件名 # 若不指定文件名,将从标准输入读取数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17选项:
sed -n '3p' file.txt # -n 只输出指定行
sed -e '2d' -e '3s/apple/banana/' file.txt # -e 执行多个编辑命令
将 file.txt 文件中所有的 "hello" 替换为 "hi",并直接修改文件内容
sed -i 's/hello/hi/g' file.txt # -i 直接修改文件内容
编辑命令:
打印 file.txt 文件中第 2 行到第 4 行的内容
sed -n '2,4p' file.txt # 打印2至4行
sed '3,$d' file.txt # 删除第3行到最后一行
sed 's/cat/dog/2' file.txt # 只替换每行的第二个cat
sed 's/cat/dog/g' file.txt # 替换所有的cat
sed '3a a new line' file.txt # 在第三行后追加一行
sed '/example/a a new line' file.txt # 在包含example的行后追加“a new line”
sed '5i add a new line before line 5' # 在第五行前插入一行
sed '5c replace the fifth line' file.txt # 替换掉第五行
sed 'y/abc/ABC' file.txt # 把abc用ABC替换掉awk
1
awk [选项] 'pattern { action }' 文件名
其中
pattern
时用于匹配输入行的条件,action
时匹配成功时执行的操作。1
2
3
4
5
6
7
8
9
10
11
12
13
14选项:
awk -F ',' '{ print $2 }' data.csv # 指定,为字段分割依据 默认空格
awk -v prefix="Line: " '{ print prefix $0 }' test.txt # -v 定义变量
awk -v threshold=15 '{ if ($1 > threshold) print $1 }' numbers.txt
模式:
awk '{ print $0 }' input.txt # 空模式 若未指定模式,awk对每一行都执行对应操作
awk '/pattern/ { print $0 }' input.txt # 打印匹配到的行
awk '$1 == "apple" { print $0 }' input.txt # 打印第一个字段为apple的行
动作:
awk '{ print $1, $3 }' input.txt # 打印每行的第1,3个字段
awk '{ sum = $1 + $2; print sum }' input.txt # 计算每行1,3字段的和并打印
awk '{ if ($1 > 10) { print "Greater than 10" } else { print "Less than or equal to 10" } }' input.txt1
2
3
4
5
6
7awk 内置变量
0:表示当前处理的整行内容。
n:表示当前行的第 n 个字段,n 从 1 开始。例如,$1 表示第一个字段,$2 表示第二个字段。
NF:表示当前行的字段数量。
NR:表示当前处理的行号,从 1 开始。
FNR:表示当前文件的行号,在处理多个文件时与 NR 有所不同。
FS:表示字段分隔符,默认是空格或制表符。可以通过 -F 选项或在脚本中修改该变量的值。cat
1
2
3
4cat -n file.txt # 添加行号地输出file.txt的内容到终端
cat file1.txt file2.txt # 将 file1.txt 和 file2.txt 的内容连接起来并输出到终端
cat > newfile.txt # 从终端读入标准输入(覆盖)写入newfile.txt
cat >> newfile.txt # 从终端读入标准输入(追加)写入newfile.txt
Shell Script
Linux下的Shell Script 类似于 Windows的批处理文件(.bat)。但是Linux当中没有拓展名的概念。
执行Shell Script:
1
./文件名
添加“执行”权限:
1
chmod +x 文件名
touch
命令创建的文件默认没有执行权限,需要手动添加。脚本文件分析:
1
2
3!/bin/bash
My first Shell script!
echo "Hello, world!"- 第一行
#!
称为Shebang
,程序加载器会将Shebang
后面的内容作为脚本的解释器。 - Shell脚本是命令和组合,事实上
echo
本身也是一条指令。在终端直接执行echo
指令会直接输出内容。
- 第一行
变量:
1
var_name=value
- 弱类型语言,无需指定类型,赋值等号两边不允许有空格。
- 使用
${var_name}
获取变量值。(或$var_name
)
脚本参数:
1
2
3
4
5
6
7!/bin/bash
str="Hello, $1 and $2!"
echo $str
终端输入如下命令: ./hello.sh world OS
输出: Hello, world and OS!
此处world和OS即是我们要传递的参数,分别对应$1,$2- 在执行语句中,参数以空格分隔,每一个参数在脚本中都是一个字符串变量。第一个参数映射到变量名1,第二个参数映射到变量名2。
- 注意要在双引号中引用变量
1
2
3
4
5!/bin/bash
str='Hello, $1 and $2!'
echo $str
输出: Hello, $1 and $2- 特殊变量
$#
:代表传递的参数个数 - 特殊变量
$*
:代表字符串,内容是传递的全部参数 - 特殊变量
$?
:获取前一条命令的返回值。(一条命令的返回值是0是表示其成功执行,作为条件时则视为其成立)
事实上
$n
是把输入命令按照空格切分,n代表第几个词块,$0
代表第0个词块,即命令本身。条件与循环:
注意等号前后不能有空格,左中括号后和右中括号前一定需要空格
1
2
3
4
5
6
7
8
9
10if condition1
then
command1
...
elif condition2
then
...
else
...
fi # 表示结束1
2
3
4
5
6a=1
while [ $a -ne 10 ]
do
mkdir file$a
a=$[$a+1]
done左中括号 [ 是一种常用作条件的命令,其参数是一个条件表达式和末尾的 ] ,该命令在关系成立时返回0。此外,true命令能够直接返回0,!命令能够反转参数中命令的返回值。
1
2
3
4
5
6-eq == (equal)
-ne != (not equal)
-gt > (greater than)
-lt < (less than)
-ge >= (greater or equal)
-le <= (less or equal)整数比较大小:
1
2
3
4
5
6
7
8
9
10
11!/bin/bash
mkdir files
cd files
i=1
while (($i <= $1)) # (())用于比较整数的大小。也可换为[ $i -le $1 ]
do
touch "file$i.txt"
i=$((i+1)) # $(())是bash中用于算术拓展的语法,可直接进行算术运算
done
该脚本用于在当前目录下新建一个files文件夹,在files里新建参数$1个.txt文件,依次命名为files1.txt, files2.txt...函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15!/bin/bash
function fun1() {
echo "Hello, world!"
}
function fun2() {
echo "I've got "$1" and "$2"!"
}
function fun3() {
echo "I'm computing first + second!"
return $(($1 + $2))
}
fun1
fun2 2 3
fun3 4 5
echo "The sum is "$?"."- 函数可以不返回值
- 函数调用方法如下:
1
fun_name param1 param2 ... paramN
其中第 N 个参数在函数体内使用只会带第一位数字。如果函数有返回值,则在函数调用的后面需要使用
$?
获取返回值。重定向:
重定向实现了将命令的输出写入文件中的功能。在命令后使用
>
符号可以将输出重定向。1
2
3ls / > lsoutput.txt
该命令实现将根目录下所有文件名输出到当前目录的lsoutput.txt文件中重定向会覆盖文件的原有内容。
注意,
>
是1>
的简写。在我们刚才提到的三种流中,0 是标准输入,1 指的是标准输出,而不包括标准错误输出。gcc
输出的编译错误消息属于标准错误输出。如果想要将错误输出到文件,需要使用2>
,也就是将错误输出重定向到文件。
<
是将文件的内容作为输入,以取代标准输入。
- 管道:
1 | command1 | command2 | command3 |
管道对命令进行连接,以上内容是将 command1
的输出传给 command2
的输入,command2
的输出传给 command3
的输入,以此类推。
1 | a.txt内容为:Hello,world! |