Linux学习

历史

GNU

即GNU's not Unix的缩写,一个类Unix操作系统,希望开发出一套自由软件环境的来取代Unix系统。操作系统包括:内核、shell、编辑器、编译器。当时唯独缺少内核,后来自由软件基金会FSF开始发展内核,命名为Hurd。林纳斯开发出了Linux,Linux并不是GNU项目的一部分,但是使用了许多GNU中的软件,Linux和GNU软件的结合,形成了完全自由的操作系统,该系统称为"GNU/Linux"或Linux。GNU依然在研发自己的Hurd,但是依然没有稳定的版本。

GNU计划开发了很多厉害的软件,这些软件也被一直到了其他操作系统(win,mac,unix)上,其中最出名的软件就是GCC。

自由软件

表示你可以直接获取源码,毕竟只有获取了源码才可能自由使用。但是免费软件你不一定获取到源码。

GCC

GNU compiler collection(GNU编译器套装),由GNU按照GPL规则开发的编译器(自由软件),亦是其他操作系统的标准编译器(特别是C语言)。GCC原本只能处理C,后来经过扩展可以处理Fortran,Pascal,Java,ada,Go以及其他语言。android的系统层也是属于Linux,故使用的是GCC,但是android的app运行在Dalvik虚拟机上,所以用的不是GCC。windows的应用大部分是自家vs编译器。mac和ios默认使用的也是GCC,后来变为clang和llvm。GCC(跨平台首选)在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。

Clang & LLVM

Apple对GCC编译器提出新增的要求,但是是被拒绝,于是LLVM诞生了。GCC代码耦合度太高,越是后期,质量越差。由于GCC是一个纯粹的编译系统,对IDE(xcode)配合很差,Apple无法使用LLVM 继续改进GCC的代码质量,便从零开始编写编译器前端,于是Clang诞生了。Apple的Clang是对C,C++,Objective-C的编译器前端,采用底层虚拟机LLVM作为编译器后端。Clang的目的是代替GCC,包括Clang前端和静态分析器。Clang输出代码对应的抽象语法树(AST),并将代码编译成LLVM bitcode,接着在后端用LLVM编译成平台相关的机器语言。Clang的编译速度和性能大幅高于GCC。GCC的兼容性是以牺牲性能得到的。

C++与Objective-C

二者都从C演化过来。Objective-C提供了运行期动态绑定。而C++ 是编译时静态绑定, 并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现。Objective-C++即允许使用C++也可使用Objective-C。

编译器的前后端

编译器前端Parse,编译器后端Generator。词法分析、语法分析、语义分析被称为前端处理,生成AST,后面优化和目标代码生成称之为后端处理。想一下是否可以为不同的高级语言单独一个前端,不同的处理器架构写一个后端GCC + 不同的configuration可以实现。GCC真正的强大在于它是自由的,如果你的硬件添加新的功能,你可以在GCC编译器后端添加相应的指令。

MinGW-w64

Minimalist GNU for Windows:让GCC在windows上运行。下载x86_64-8.1.0-release-win32-seh:在windows上开发选择win32,在Linux,mac,unix选择posix;异常处理模式为seh。然后把其bin复制到环境变量中。cmd中gcc -v查看是否成功。MinGW包括最基本的gcc-core、gcc-g++、binutils 和 MinGW runtime。gcc (gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是"预处理"和"编译",以及提供了与编译器紧密相关的运行库的支持。binutils 提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常工作的。glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,

gdb

gdb表示GNU symbolic debugger来调试源码,查找bug。如果没有bug,可以选择在生成版本时,选择-00到-03表示编译优化。

C语言来历

C语言由B语言演化而来,丹尼斯里奇最初为了开发Unix而制作,可以用于编写系统级软件,Unix/Linux/RDBMS(比如MySQL)

令牌Token

令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。Token 是程序中对编译器有意义的最小元素,注意区别于字符集。关键字,标识符,常量,字符串,运算符,特殊符号;

Linux基础

  1. 什么是Linux?

    Linux是一套类Unix的OS,继承了Unix以网络为核心。Linux是多用户多任务,DOS是单用户单任务(windows模拟DOS)。

  2. Linux区别Unix

    开源、GUI+CLI、硬件要求低、跨平台、易学习、安全低。Unix相反

  3. Linux内核(大部分操作系统内核的作用相似)

    内核控制着系统中所有的硬件和软件,执行软件、分配硬件。包括:系统内存管理、应用程序管理、硬件设备管理、文件系统管理。

  4. Linux应用领域

    网站:LAMP=Linux+Apache+MySQL+PHP。LNMP=Linux+Nginx+MySQL+PHP

  5. 体系结构

    用户空间:应用程序、C库

    内核空间 :系统调用接口、内核、平台架构相关的代码

    用户→内核:1.系统调用、2.硬件中断

  6. Bash区别cmd区别bat

    shell:壳。连接用户与内核,命令解释器

    bash(Bourne Again SHell):Linux的shell。区分大小写,/目录分割符,\转移字符。

    cmd:windows的shell。

    bat:DOS下的命令,bat文件表示批处理。\目录分割符,/参数分割符。

  7. 开机启动过程

    POST(加电自检)→加载BIOS→确定启动设备并加载boot loader→加载kernel初始化initrd→运行/sbin/init初始化系统→打印用户登陆提示符

  8. Linux系统缺省:

    缺省即默认。

  9. 日志文件

    /var/log/message

  10. 桌面环境

    KDE和GNOME

  11. 交换空间

    swap space磁盘上临时保存内存中多余的程序和数据。

  12. LILO

    Linux loader将Linux操作系统加载到内存中

  13. 发行版本

三剑客

echo $?

grep

命令成功后返回0,没结果返回1,出现错误返回2

  1. grep(global regular express print)查找

    shell 复制代码
    grep [options] pattern [file]
    
    
    --color=auto
    -v 显示未匹配到的行
    -f 从文件中获取pattern
    -i 忽略大小写
    -n 第几行
    -c 行数
    -o 只显示匹配到的
    -q 静默模式,不显示任何信息
    -A 表示After
    -B 表示Before
    -C 表示Context
    -e 表示多个逻辑关系or	grep -e 'cat' -e 'dog' file
    -w 匹配单词
    -F 相当于fgrep,将pattern视为固定字符串
    不懂的
    -s
    -E 相当于egrep
    
    #例子
    grep -n dog file	
    grep -nv dog file
    grep ^d file
    grep g$ file
    
    grep 'do*' file区别grep -F 'do*' file

sed

stream editor:编辑到匹配的文本。需要学习正则表达式regex

shell 复制代码
sed [-hnV][-e<script>][-f<script文件>] file

a add新增,目前的下一行
i insert插入,目前的上一行
c change代替
d 删除
p 打印
s stead取代



#例子
sed 3a\newLine file
sed /Linux/a\dog file

sed 3c\newLine file
sed /Linux/c\dog file


sed 3d file
sed /Linux/d file

sed 3i\newLine file
sed /Linux/a\dog file

sed -n 2p file 		#打印第二行
sed -n 2,5p file	#打印2~5行

sed	s/dog/cat/g file	#替换。s表示取代,g表示全局
sed s/^/newstart/g file
sed 's/$/newend/g' file
sed s/a/A/3g file

#多行操作
sed -e s/LINUX/dog/g -e s/Linux/dog/g file

扩展

bash 复制代码
+ g:将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
+ G:将hold space中的内容append到pattern space\n后
+ h:将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
+ H:将pattern space中的内容append到hold space\n后
+ d:删除pattern中的所有行,并读入下一新行到pattern中
+ D:删除multiline pattern中的第一行,不读入下一行

#文件名:1
1
2
3

//倒序
sed '1!G;h;$!d' 1	//第一行不执行G,最后一行不执行d

//打印1,1~2,...,1~9
seq 9|sed 'H;g'

//打印九九乘法表
seq 9|sed 'H;g'|awk -v RS='' '{for(i=1;i<=NR;i++)printf("%dx%d=%d%s",i,NR,i*NR,i==NR?"\n":"\t")}'

awk

(命名类似kmp)格式化文本。以行读入,并以空格为分隔符切片。l

bash 复制代码
awk [选项参数] 'script' var=value file #script可以是 -f scriptfile。script单引号必须有

awk的变量分为内置变量和自定义变量
内置变量:
FS(Field Separator):输入字段分隔符, 默认为空白字符
OFS(Out of Field Separator):输出字段分隔符, 默认为空白字符
RS(Record Separator):输入记录分隔符(输入换行符), 指定输入时的换行符
ORS(Output Record Separate):输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF(Number for Field):当前行的字段的个数(即当前行被分割成了几列)
NR(Number of Record):行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数

自定义变量:
方法一:-v varname=value ,变量名区分字符大小写。
方法二:在program中直接定义。


awk '{print $1,$3,$0}' file	#必须带有单引号,打印每行的1和3号单词。$0表示整行
awk -F, '{print $2}' file 	#以逗号为分隔符
awk -F '[ ,]' '{print $1,$2,$5}' file	#以逗号和空格为分隔符
awk '/^this/' file		#打印this开头的行
awk '/th/' file			//带有th的行
awk '$2 ~ /th/ {print $2,$4}' file	//第二个中带有th的行,并打印行的第二和第四个
awk '$2 !~ /th/ {print $2,$4}' file	//取反,不解释
awk '!/th/ {print $2,$4}' file
awk 'BEGIN{IGNORECASE=1} /this/' file	//忽略大小写

awk 'length>8' file	//行长大于8的行

awk脚本

bash 复制代码
#文件 score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

#文件cal.awk
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

$awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350 
AVERAGE:     63.80    78.60    70.00

//计算所有txt的大小。不懂
ls -l *.txt | awk '{sum+=$5} END {print sum}'	 

shell脚本编程

  1. shell脚本
  2. 使用的变量
  3. 编程中条件、循环的使用
  4. 脚本的执行和调试
  5. 定义函数
  6. 算数运算

文件命令管理

  1. cat
  2. chmod
  3. chown
  4. cp
  5. find
  6. head
  7. less
  8. ln
  9. locate
  10. more
  11. mv
  12. rm
  13. tail
  14. touch
  15. vim
  16. whereis
  17. which
  18. grep
  19. wc

磁盘命令管理

  1. cd
  2. df
  3. du
  4. ls
  5. mkdir
  6. rmdir
  7. pwd

网络通讯命令

  1. ifconfig
  2. iptables
  3. netstat
  4. ping
  5. telnet

系统+备份

  1. date
  2. free
  3. kill
  4. ps
  5. rpm
  6. top
  7. yum
  8. bzip2
  9. gzip
  10. tar
  11. unzip

情绪:人活着总要做些有意义的事情,否则和死了有什么区别,我正因此而活着。客观跳出自己。

逻辑:本质(大道至简) + 回顾。

行为:做出来。

x+100 = n^2^

x+268 = m^2^

(m-n)(m+n) = 168;可知i=m-n;j=m+n均为偶数;

相关推荐
海阔天空_20139 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
桥田智能12 分钟前
气爪在自动化装配线中是如何应用的?
运维·自动化
hong16168830 分钟前
跨模态对齐与跨领域学习
学习
阿伟来咯~1 小时前
记录学习react的一些内容
javascript·学习·react.js
Suckerbin2 小时前
Hms?: 1渗透测试
学习·安全·网络安全
水豚AI课代表2 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
聪明的墨菲特i2 小时前
Python爬虫学习
爬虫·python·学习
€☞扫地僧☜€2 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
hjjdebug2 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯2 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器