图片来源:https://www.pixiv.net/artworks/65838500 term 表示信号终止进程,core 表示进程产生核心转储文件并退出,ignore 表示忽略该信号,stop 表示信号停止了进程,cont 表示信号恢复了一个已停止的进程 信号 信号值(x86) 默认行为 描述 触发场景 SIGABRT / SIGIOT 6 core 进程终止信号 进程调用 abort()函数时,系统向进程发送该信号 SIGALRM 14 term 实时定时器过期 调用 alarm()或 setitimer()而设置的实时定时器到期,内核将产生该信号 SIGBUS 7(不可移植) core 内存访问错误 使用由 mmap()所创建的内存映射时,如果试图访问的地址超出了底层内存映射文件的结尾,那么将产生该错误 SIGCHLD 17(不可移植) ignore 子进程终止、暂停、继续 子进程终止、子进程因收到信号而停止或恢复时向父进程发送该信号 SIGCONT 18(不可移植) cont 如果被暂停,重新继续执行 将该信号发送给已停止的进程,进程将会恢复运行。当接收信号的进程当前不处于停止状态时,默认情况下将忽略该信号 SIGEMT 未定义 term 硬件错误 UNIX 系统通常用该信号来标识一个依赖于实现的硬件错误。Linux 系统仅在 Sun SPARC 实现中使用了该信号 SIGFPE 8 core 算术异常 在 x86-32 架构中,整数除以 0 总是产生 SIGFPE 信号,但是对浮点数除以 0 的处理则取决于是否启用了 FE_DIVBYZERO 异常。如果启用了该异常(使用feenableexcept()),那么浮点数除以 0 也将产生 SIGFPE 信号,否则,将为操作数产生符合 IEEE 标准的结果(无穷大的浮点表示形式)。 SIGHUP 1 term 挂起 检测到控制终端挂起或者控制进程死亡时,进程会收到 SIGHUP。许多守护进程会在收到 SIGHUP 信号时重新进行初始化并重读配置文件。nohup 命令用于无视该信号 SIGILL 4 core 非法的指令 如果进程试图执行非法(即格式不正确)的机器语言指令,系统将向进程发送该信号 SIGINT 2 term 终端中断信号 当用户键入终端中断字符(通常为 Ctrl-C)时,终端驱动程序将发送该信号给前台进程组 SIGKILL 9 term 杀死 此信号为“必杀(sure kill)”信号,处理器程序无法将其阻塞、忽略或者捕获,故而“一击必杀”,总能终止进程 SIGIO / SIGPOLL 29(不可移植) term I/O 时可能产生 利用 fcntl()系统调用,即可于特定类型(诸如终端和套接字)的打开文件描述符发生 I/O 事件时产生该信号 SIGPIPE 13 term 管道断开 当某一进程试图向管道、FIFO 或套接字写入信息时,如果这些设备并无相应的阅读进程,那么系统将产生该信号 SIGPROF 27(不可移植) term […]
linux基础知识
图片来源:https://www.pixiv.net/en/artworks/101574081 最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。 1940年,沃伦·麦卡洛克与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。 1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为「正则集合」的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,随后是Unix上的编辑器ed,并最终引入grep。自此以后,正則表达式被广泛地应用于各种Unix或类Unix系统的工具中。正则表达式的POSIX规范,分为基本型正则表达式(Basic Regular Expression,BRE)和扩展型正则表达式(Extended Regular Express,ERE)两大流派。在兼容POSIX的UNIX系统上,grep和egrep之类的工具都遵循POSIX规范,一些数据库系统中的正则表达式也符合POSIX规范。grep、vi、sed都属于BRE,是历史最早的正则表达式,因此元字符必须转譯之后才具有特殊含义。egrep、awk则属于ERE,元字符不用转譯 。 维基百科 BRE 和 ERE 是 POSIX 标准中定义的两种不同风格的正则表达式, 只支持一些比较基础功能,没有贪婪匹配( .* )和非贪婪匹配( .*? )的区别(具体效果要看具体的实现,GNU的实现中均表现为贪婪匹配,另外一些实现中 .*? 可能导致语法错误),也不支持正、逆向巡视等语法。 BRE语法 . :匹配单个任意字符, 匹配 . 本身使用 \. * :前面的字符或模式重复任意次,匹配 * 本身使用 \* \{m\} :前面的字符或模式重复m次 \{m,n\} :前面的字符或模式重复m到n次 \{m,\} :前面的字符或模式重复m次及以上 \(regexp\) :分组,将 \( 和 \) 之间的内容视为一个整体,有两个作用 ^ :放在正则表达式开头则匹配行首,其他位置匹配 ^ 本身 $ :放在正则表达式末尾则匹配行尾,其他位置匹配 $ 本身 [list] :自定义字符集,可以匹配 [ 和 ] 之间出现的任意字符,例如: a[bcd] 可以匹配”ab”,“ac”或“ad”。且支持使用char1-char2这种省略写法,例如: [0-9]* 可以匹配”1234567890“ , [a-c]* 可以匹配“cabba” [^list] :同上,但匹配所有没有出现在 [ 和 ] 之间的其他字符 另外其他风格的正则表达式中有诸如 \d \w \s 等速记符号(shorthand)表示一些常用字符集,BER和ERE均不支持这种写法,取而代之的是POSIX标准中定义的字符集: POSIX Description ASCII Shorthand [:alnum:] 数字和字母 [a-zA-Z0-9] [:alpha:] 字母 [a-zA-Z] [:ascii:] ASCII字符 [\x00-\x7F] [:blank:] 空格和 Tab [ \t] \h [:cntrl:] 控制字符 [\x00-\x1F\x7F] [:digit:] 数字 [0-9] \d [:graph:] 可视字符 [\x21-\x7E] [:lower:] 小写字母 [a-z] \l [:print:] 可打印字符 [\x20-\x7E] [:punct:] 标点符号 [!”#$%&'()*+, -./:;<=>?@[ […]
图片来源:https://www.pixiv.net/artworks/89845503 有如下三个表格,他们各自对应一个CSV格式文件 Fruit Qty Price Apple 13 1.1 Banana 24 2.3 Pear 7 1.5 Fruit Qty Price Apple 27 5.5 Pear 40 3.04 Watermelon 5 0.99 Fruit Qty Price Banana 12 0.55 Pear 15 2.98 Peach 8 6 使用awk合并上述3个表格,对于相同水果合并数量并求均价 用法: 输出: 合并后输出为CSV格式的单行版本 输出:
图片来源:https://www.pixiv.net/artworks/42320059 大多日志都会在行首添加时间信息,通过在awk脚本内调用date命令把时间信息转换为时间戳进行比较实现日志截取 以linux启动日志为例,以空格为分隔符的话,前三个字段为时间信息 下面的脚本截取 2022-11-11 12:51:44 ~ 2022-11-11 12:52:44 这一分钟内的日志(执行:./logfilter.awk boot.log) 或者略微修改一下,通过命令行传入起止时间 用法
图片来源:https://www.pixiv.net/artworks/81733152 使用sed处理类似下面这样的有独立的首尾特征的多行结构数据,实现增删改查 增 给梨添加一个产地字段(from = guangxi) 删 删除苹果的产地 改 修改香蕉的价格 查 打印所有打折的水果(on_sale = true) 单行版本 多行版本 参考:
图片来源:https://www.pixiv.net/artworks/101597578 大端序(网络序):高字节在低地址 小端序:高字节在高地址 判断当前运行环境的字节序 C++ 通过自定义变量值判断 另外,C++标准中对于结构体的非活跃成员的访问属于未定义行为,虽然使用g++编译运行都没问题,但以下代码不能保证运行结果正确 使用GCC宏 C++20标准库已经内置了字节序相关变量 Shell 输出“1”则为小端序,输出“0”则为大端序 查看CPU参数 CPU相关信息里的“Byte Order”字段有字节序信息 转换 Linux函数 Shell 反转字节序,输入输出均为十进制数 参考:
图片来源:https://www.pixiv.net/artworks/101077465 Debain,Ubuntu,Deepin等使用deb包的发行版 已安装的包 根据文件名(命令名)查找包名 根据包名查看其所包含文件 未安装的包 要查找未安装的包需要额外工具 apt-file (使用 sudo apt install apt-file 安装),使用前可以先更新本地缓存 sudo apt update 根据文件名(命令名)查找包名 根据包名查看其所包含文件 RHEL,Centos,Fedora等使用rpm包的发行版 根据文件名(命令名)查找包名 或 根据包名查看其所包含文件 要查询未安装的包所包含的文件需要额外工具 repoquery (使用 sudo yum install yum-utils 或 sudo dnf install dnf-utils 安装) Arch,Manjaro等使用 pacman 的发行版 根据文件名(命令名)查找包名 或 根据包名查看其所包含文件 或
图片来源:https://www.pixiv.net/artworks/100039624 Fork bomb 将文件内容写入剪贴板 打印剪贴板内容 解锁被pam锁定无法登录的用户 创建大文件,修改bs和count参数可以调整大小,合理的bs大小能提高执行效率,下面的命令在我的SSD上创建文件仅需0.35秒 Vim编辑后发现因权限不足无法保存,可以在Vim内将未保存的内容导出同时再使用sudo权限强行写入原文件,然后使用“:e!”重新加载当前文件 查看各个系统目录含义 查看ASCII码表 备份文件 获取当前时间戳 将时间戳转换为日期 创建临时文件、文件夹 URL解码 二进制处理 查看二进制文件 截取二进制文件,利用dd命令,skip参数跳过前n个字节,count参数控制读取长度 将十六进制文本转换为二进制文件 字节序反转 网络 显示IP,有多个网卡的话可能会显示多个,使用空格分割 SSH远程执行命令 SSH远程执行本地shell脚本 如果要远程后台执行一个长时间的任务,并且立刻返回,仅仅“nohup command &”是不行的,还需要把输入输出重定向 设置静态IP地址 设置默认路由 网速监控 Core Dump 查看 coredump 文件大小限制 查看 coredump 文件生成位置和生成格式 临时修改 coredump 文件生成位置和生成格式 不生成 coredump 文件,修改配置文件 /etc/sysctl.d/50-coredump.conf 。 若要使修改后配置立即生效,执行 列出所有生成的 coredump 文件(不包括 gdb 手动生成的) 查看 coredump 文件信息 使用 gdb 调试 GDB 内手动生成 coredump 进程 通过程序名获取进程 PID 查看运行中进程的环境变量 启动 查看系统开机启动耗时 查看开机各个进程启动耗时 查看启动日志 参考:
图片来源:https://www.pixiv.net/artworks/99335528 SUID SGID SBIT 全称 set UID set GID Sticky Bit 解释 s标志出现在文件拥有者的x权限位置上 :-rwsr-xr-x s标志出现在文件群组的x权限位置:-rwxr-sr-x t标志出现在其他人的x权限位置:drwxr-sr-t 添加命令 chmod u+s file chmod g+s file_or_dir chmod o+t dir 有效对象 二进制可执行文件 二进制可执行文件,文件夹 文件夹 效果 文件执行者在该程序运行期间将获得程序拥有者的权限 对于文件:文件执行者在该程序运行期间将获得程序所在群组的权限; 对于文件夹:使用者在该文件夹下时,有效群组将变成该文件夹的群组 当使用者在该文件夹下创建文件或文件夹时,仅有自己与 root 才有权力删除该文件 这三个权限都是建立在可执行权限之上,当可执行标志位为空时设置,如果设置了SUID、SGID和SBIT,会显示为大写:rwSr-Sr-T 参考: 《鸟哥的Linux私房菜——基础学习篇(第四版)》