Linux快速入门

本文是 Linux 命令行和一些小工具的笔记,方便忘记了回顾用

Linux基本命令

目录操作

  • pwd:present workspace direction | 当前的位置
  • cd:跳转目录
    • cd ~:跳转到全局变量 HOME 指向的目录
    • cd ..:返回上一级
    • cd test:进入当前目录下的 test 文件夹
  • ls:列出当前目录内的文件和文件夹
    • ls -l:将会显示文件和文件夹的详细信息,其中每行前10个字符的形式为 drwxrwxrwx ,第一个字符表示类型:文件夹为 d ,文件为 - ;后面每三个为一组,分别代表 u (作者),g (小组) 和 o (其他)这三类人群的读 r 、写 w 和运行 x 的权限
  • chmod o-rw filename.txt :去除其他(o)这类人的读(r)写(w)权限
  • chmod u+x filename.txt:增加作者(u)这类人的运行(x)权限

这里也可以使用二进制更改,如 chmod 444 filename.txt 会使得 filename.txt 文件的权限变为 r--r--r--

文件操作

  • cp filename.txt target.txt:将 filename.txt 复制一份并命名为 target.txt
  • mkdir dirname:创建一个名为 dirname 的文件夹
  • rmdir:删除空文件夹
  • rm:删除文件(rm -rf dirname 可以实现删除有内容的文件夹,r 代表向下递归,f 代表强制删除)

Linux没有回收站,需要谨慎使用rm 命令,尤其涉及到 rm -rf

  • touch filename.txt:创建名为 filename.txt 的文件
  • mv filename.txt tragetname.txt/tragerdir :将文件重命名为 tragetname.txt 或者把文件移动到 tragetdir 目录下
  • cat filename.txt:在终端输出 filename.txt 的文件内容
  • less filename.txt:在终端输出 filename.txt 的文件内容,不过一次加载一面,按 Q 退出
  • diff filename1.txt filename2.txt :输出 filename1.txtfilename2.txt 中不同的地方
  • head filename.txt -n 6:查看 filename.txt 文件前 6 行的内容
  • tail filename.txt -n6:查看 filename.txt 文件后 6 行的内容
  • wc filename.txt:查看 filename.txt 的行数(-l)、单词书(-w)和字符数(-c)
  • find:文件查找指令
    • find . -name filename.txt -type -d :在当前目录下查找名字为 filename.txt 的文件夹(type -f 表示文件)
    • find / -size +10M:找到所有文件大小大于 10M 的文件
    • find / -ctime -1:找到所有修改时间在一天内的文件 (可替换为-cmin表示1min之内修改,+1 表示一天/min前修改的文件,c 表示更改、a 表示读)
      • -ctime:文件 iNode 信息发生改变
      • -mtime:文件内容发生改变
      • -atime:文件查看
    • find . -maxdepth 3 -name filename.txt :找到当前文件夹下文件层数最多为3文件名称为 filename 的文件

正则表达式

  • grep Text filename.txt:在 filename.txt 中查找 Text ,会把所有存在的输出(所在的那一行打印)
    • grep TT* filename.txt :首字母是 T,随后跟着0~n个 T 所在的那一行
    • grep ^Tex filename.txt :以 Tex 开头的那一行
    • grep T.xt filename.txt:存在 T 任意字母 xt 的那一行,如 TextTaxt
    • grep [Tt]ex[A-Za-z] filename.txt:包含首字母是 Tt ,中间是 ex ,最后一个是任意字母序列的那一行
    • grep -n Text filename.txt :输出行号
    • -r:递归子路径
    • -A 2:输出找到的那一行和它下面2行(After)
    • -B 2 :输出找到的那一行和它上面2行(Before)

其他

  • date:当前日期时间
  • cal:当月日历
    • cal 2020
    • cal 1 2020
  • grep tex filename.txt | wc| 表示命令的组合,把 | 前面得出的结果传递给这个符号后面的命令,这个例子的输出是统计 filename.txt 文件里包含 tex 序列的行数、单词书和字符数

Shell脚本

  • Linux的脚本文件以 .sh结尾,使用 sh test.sh 运行(当有 数组 时,使用 bash test.sh
  • >< :重定向命令,把输出打到文件或者把文件内容当成输入
  • a=10:给变量 a 赋值为 10,注意 = 两端不能有空格
  • $a :使用变量 a
  • echo $a Text:输出的命令,相当于 cout << a << " Text";
  • read a 输入保存到变量 a
  • c='expr $a + $b' :计算表达式,其中 ' 是键盘上 ~ 对应的飘号,注意运算符两边要有空格

  • *,(,)号无法当作乘号,应该在前面加上转义符号 \

  • 判断

    1
    2
    3
    4
    5
    6
    if [ $a -gt $b ]
    then
    echo $a
    else
    echo $b
    fi
    • 对于数字,用 -gt,-lt,-gq,le,-eq,-ne 表示 $\gt,\lt,\ge,\le,=,\ne$
    • 对于字符串,可以直接使用 >,=,<
  • 循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for i in 1..3
    do
    echo $i
    done
    a=10
    while [a -gt 0]
    do
    echo $a
    a=`expr $a - 1`
    done
  • -z a :判断 a 是否是空,相反,用 -n 可以判断 a 是否不空

  • 数组初始化:array=(1 2 3)
  • 数组元素的使用:echo ${array[2]}
  • 数组的遍历
1
2
3
4
for i in ${array[@]}
do
echo $i
done

Vim

编辑器

命令 解释
:w 保存文件
:q 关闭文件,:wq 表示保存并关闭文件,:q! 表示强制关闭文件
j/J k/K h/H l/L 让光标进行上、下、左、右的移动
3gg/GG 3j/J 3k/K 让光标移动到第3行、光标向上移动3行、光标向下移动3行
/string 查找字符串 string 文件中的所有该字符串都会高亮显示 n/N 可以让光标定位到下一个 stringCtrl+n/N 可以让光标定位到上一个 string
CC Y P U 剪切所在行、复制、粘贴、撤销
V 进入 Visual 模式,可以大规模选中

GCC

编译器

官方文档:https://gcc.gnu.org/onlinedocs/gcc-11.2.0/gcc.pdf

阶段停止的命令

graph LR
	A[hello.cpp] --预处理器-E--> B[hello.i]
	B --编译器-S--> C[hello.s]
	C --汇编器-c--> D[hello.o]
	D --链接器--> E[hello]
	F[printf.o] --链接器--> E[hello]
选项 解释
-E 只运行预编译器,生成修改了的源程序文本文件
-S 只运行到编译器,生成汇编程序(文本文件)
-c 只运行到汇编器,生成二进制的可重定位目标程序

debug相关

选项 解释
-g 生成调试信息。GNU 调试器可利用该信息。
-Og 不进行优化处理。
-O1 -O2 -O3 优化生成代码,数字越大,优化程度越高

其他

gcc 命令的常用选项

选项 解释
-o FILE 生成指定的输出文件,用在生成可执行文件时
-pthread 用于生成多线程的可执行文件

GDB

调试器

Makefile

解决多文件编译输入命令麻烦的问题

假如有以下文件需要编译成一个可执行程序

graph LR
	main.cpp
	main.cpp --> math.cpp --> math.h
	main.cpp --> tool.cpp --> tool.h

用下面的命令可以将这些程序编译为名字为 main 的可执行程序

1
g++ main.cpp math.cpp tool.cpp -o main

但是当文件很多时,这样写就很麻烦,这时候就需要 Makefile 了

1
2
3
4
5
6
7
8
9
CC = g++	# 定义变量
main: main.cpp math.o tool.o # 从这一句开始一次查找依赖, 发现需要 math.o tool.o
$(CC) main.cpp math.o tool.o -o main
math.o: math.cpp # 构建 main 需要 math.o, 执行这一步
$(CC) -c math.cpp
tool.o: tool.cpp # 同上
$(CC) -c tool.cpp
clear: # 构建 main 不需要执行 clear, 因此不会执行这一步
rm *.o main

Makefile文件的名称必须是 Makefilemakefile ,编译的时候,在命令行中执行下面的语句就可以了

1
make

执行 clear 执行需要在命令行中执行

1
make clear

Linux快速入门
https://fu-qingchen.github.io/2021/08/09/HUST/LinuxCrash/
作者
FU Qingchen
发布于
2021年8月9日
许可协议