linux学习小记 (一 )

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux学习小记 (一 )相关的知识,希望对你有一定的参考价值。

shell 学习小记:

注意:多看系统脚本  多模仿   

su切换用户时需要输入目标用户密码,root(superuser)切换到任何用户都不需要输入密码,- 参数必须要是最后一个(su huhu -)
sudo需要输入当前用户密码,拥有sudo特权的用户可以执行 "sudo su -"命令,使用自己的密码切换到root用户 ,
所以应该在/etc/sudoers 文件中禁止 sudo 执行su命令

linux文件与颜色: /etc/DIR_COLORS   (命令dircolors,  man dir_colors)
suid: 需要提供给普通用户,但又需要root权限才能正确执行的命令基本都有suid权限(e.g passwd 、mount、su)
SBIT权限(t):仅对目录有效,若自己在该目录下创建了文件,则只有root与自己可以删除(/tmp目录权限) 


-------
linux中不用的内存会被缓存起来,所以总内存是“free” +“buffer” 之和
---------

~:代表家目录
-:代表上一个工作目录

搜索命令(5个):
1、whereis : 不是在磁盘中漫无目的找,而是在数据库(/var/lib/mlocate)中找,且只可以查找可执行文件、联机帮助及源码文件
    该数据库是系统自动创建的包含了本地的所有文件信息,并且每天执行updatedb命令进行更新,因此导致有时候查询不准,
    若想准确,可以在查找之前执行下updatedb,但不建议这样干。
2、locate:也是用mlocate数据库,但其算法复杂,匹配路径或者文件名中出现的目标:
    locate ls ——匹配非常之多
    locate -b "\ls" 
    注:locate与whereis机制相同,为了速度就损失了精确度
3、which:
    他只在$PATH环境变量定义的路径下查找可执行文件的位置;一般用于确认系统中是否安装了某款软件,如gcc
4、type:
    判断一条命令是否是系统内置的,若是非内置的,若使用了-p选项,则相当于which命令
5、find
    他呢无所不及,就是效率差,他是从磁盘中查找,可以设置非常精确的查询条件,他可以规范对找到的文件做啥操作
    find / -mtime -1 -exec ls -l {} \;   
    {}是占位符,他会不断被替换成被找到的文件
    ;:是exec的结束标志,但;在bash中有特殊含义,所以需要转义

打包压缩tar:
压缩比小到大: gz<bz2<xz,压缩速度正好相反
解压缩所有类型的tar包(所有类型): 
    tar -vxf filename  这种形式“f”选项一定要在最后或者
    tar -vx  -f filename 
创建压缩包:略显麻烦,比解压缩时候多一个选项,该选项其实就是选择的压缩算法:
    z —— gz;  j——bz2 ; J——xz
 e.g.  tar -zcvf filename.tar.gz  Files  ; 
       tar -jcvf filename.tar.bz2  Files ;
       tar -Jcvf filename.tar.xz  Files  ;
备份还原工具—— dump、restore
cpio:  用于备份任何东西,也可以实现对文件打包,linux的启动初始化镜像文件initrd是使用cpio制作,
       其生成的文件名不是利用选项提供而是通过标准输入传递的,输出也是输出到标准输出,一般为了打包成功:
    打包:find ....   | cpio -ocB >filename
    解包: cpio -idc <filename

Linux程序执行问题:
 windows:直接输入程序名(命令名字),系统会在%PATH%及当前目录下寻找
 linux :直接输入名字,系统只在$PATH下查找,不会再当前目录下查找,所以即使在当前目录也需要带路径:  ./cmd-name 

linux管道与IO重定向
 linux多任务协调值管道(匿名管道),也称为FIFO,命名管道需要用mkfifo创建一个文件类型为p的文件
 匿名管道其实就是一种隐式的重定向,显示的即常见的: >   >> <  << 等: < 表示经其右边的内容重定向到键盘输入
 流式处理:find /root   | cpio -ocB | gzip -9 > /tmp/boot.img   (三个命令同时运行,体现了多任务)
 
 前后台任务(jobs\fg\bg):
 将一个前台任务变为后天任务: ctrl+z    ;命令后加与符号(&)
 停止后台任务: kill -9  %任务号 :  kill后传递的是进程id,但这与任务号有冲突,所以加%
 linux下的任务是与操作者的终端相关联的,只要你退出了终端,所有与该终端相关的任务(jobs)都会停止,
 此时若想终端关闭而任务依旧需要利用nohup命令(nohup 命令  & ,任务输出到了nohup.out)
 
 计划任务(at\crontab ):注意命令尽量使用全路径
  一次性计划创建任务:  at 10:00 tomorrow  ,回车,输入需执行命令:echo "helloworld" ,ctrl + d 保存
                                                (linux中ctrl+d 表示EOF,说明输入完毕)
 周期性计划任务: crontab(5部分):
                分钟  小时  日  月  周 [用户名] 命令
计划任务并不是任何人都可以添加,他有四个黑白名单决定:
at.allow at.deny   cron.allow  cron.deny

守护进程:stand alone与xinetd

ps aux :查看系统所有进程信息
ps ux:查看当前用户进程信息
ps -l :查看与当前终端关联的进程
源码安装:
make clean (distclean)\configure\make\make install
软件包管理工具(君子善假于物):rpm  d
安装():
   rpm -ivh pkg (rpm安装环境一定要与打包时的环境一致才可以,如果两者不同则需要SRPM) |  dpkg -i  deb-pkg
查询:
    rpm -qa ,rmp -ql XXX(查询该软件向系统写入的文件列表)
    dpkg -l , dpk --listfiles
卸载:
 rpm -e  XX  | dpkg -e XX
 
线上升级工具: apt(advance packaging tool) 、yum(yellowdog updater modified)——python写的,所以升级时注意,否则yum可能不可用

linux文件系统格式:
extN(n=2、3、4)是基于iNode的文件系统,一个iNode数据结构(存储属性及权限)代表一个文件,数据则在data block,二者都有唯一编号
iNode会记录data block的引用,从而可以找到文件任意一段数据。(索引式文件系统)
而Fat32则是data block之间的引用,加载当前块,才可以知道后续块位置(ext则可以一次知道所有位置,然后安排合理的读取顺序)

linux磁盘管理
磁盘操作:du\df\dd\fsck\mount
每一块磁盘分区都是文件系统的一个具体实例(类与对象关系) ,/etc/fstab :决定分区的连接

逻辑卷:可以弹性的调整文件系统的容量,即在磁盘分区与文件系统之间增加的逻辑层
linux 卷、逻辑卷(容量可以任意缩放)、物理卷、卷组、物理扩展区(每个PV都会以PE为基本单位进行划分)
物理卷加入卷组中,创建逻辑卷相当于对卷组这个大磁盘进行分区
LVM三部曲pv、vg、lv,LVM使用步骤:
1、在物理分区(PP)上创建物理卷(PV)
    pvcreate /dev/sda1   //将传统分区变为LVM中的物理卷
2、在创建卷组(VG)
    vgcreate vg /dev/sda1   //将(1)中创建的物理卷加入卷组vg来完成卷组的创建
3、从 VG 中分配空间,创建逻辑卷(LV)
    lvcreate -L 20G -n data vg //从卷组vg中创建大小为20G,名称为data的逻辑卷分区
4、格式化新创建的LV为某种文件系统类型
    mke2fs -j /dev/vg/data     //将LV格式化为ext2文件系统类型
5、挂载LV
    mount -t reiserfs /dev/vg/data /mnt/

》》》》》》》》》》》》》》》》》》》》》》》》》》》》
shell :
注意:自由login shell才会读取系统的设置文件/etc/profile,每个用户登陆取得bash后一定会读取/etc/profile
     /etc/profile还会调用:
     /etc/inputrc :设置bash的热键
     /etc/profile.d/*.sh : bash操作界面、语义、公共的命令别名
     /etc/sysconfig/i18n 
登陆shell会首先读取系统环境设置文件:/etc/profile ,之后会读取个人配置文件,
个人配置文件主要是几个隐藏文件:~/.bash_profile ,/.bash_login,~/.profile,此三个文件可能不会同时存在,
会按从左到右顺序,找到一个后其他的就忽略,如果~/.bashrc存在,则~/.bash_profile还会调用该文件。
用户目录下还有俩个个人配置文件:~/.bash_history 、~/.bash_logout

文件内容查看: cat、more、less、head、tail

“cut -d‘ ‘ -f1 ~/.bash_history|sort -d|uniq -c|sort -nr|head”  :统计最常用的10条命令及其使用次数

==========================
1、注意shell的执行权限问题及逻辑依赖关系
 e.g  清除linux系统日志 /var/log/messages   ( 高版本的linux可能没有开放该文件)
    cd /var/log/
    cat /dev/null > /var/log/messages
    echo "logs cleaned up"
  该脚本存在很多问题:
   1、如果不是root,该shell就执行不了,但是该shell没有提示,不友好
   2、语句之间缺少逻辑:万一cd /var/log 失败,后面的就不应该开干啊
    logfile=/var/log
    rootuid=0
    if [ $uid -ne $rootuid ];
    then
        echo ‘must be root to run this script‘
        exit 1
    fi
    cd $logfile || {
        echo ‘cant not change to the target directory‘ >&2
        exit 1
    }
    cat /dev/null > messages && echo ‘logs cleand up‘
    
    注意:这里大括号使用,一般如果if判断只有有多条语句可以考虑使用大括号,相当于if else
    
 2、清空日志方法3种方式:
    echo "" > test.log   || echo > test.log
    >test.log
    cat /dev/null > test.log
 3、shell脚本执行方式(推荐指定shell解释器方式)
    A、bash script-name 或  sh script-name(推荐使用)  ---- 当脚本本身没有可执行权限时
    B、path/script-name  或者 ./script-name(当前路径下执行脚本)  -- 脚本本身必须具备可执行权限
    C、source script-name 或 . script-name    ---- 
           此种方式执行后会将子shell中定义的变量传回到父shell
         (在一个shell中加载另外的shell,并想使用被加载的shell中的变量,后者export 子shell变量)
4、shell中中括号[]两边是要有空格的
5、shell变量
    全局变量(环境变量):可在其创建的shell及该shell派生的shell中使用。(在用户家目录.bash_profile文件或者全局/etc/profile文件)
                    环境变量在应用于用户进程之前需要利用 export 导出
        定义方法:
           export var_name=var_value
           var_name=var_value ;export var_name;
           declare -x var_name=var_value
    局部变量
    
6、单引号、双引号、反引号
    单引号里面的变量不会做解析,单引号里是啥就输出啥;
    双引号里的变量引用会做变量解析后输出,适合字符串中有变量的情况,但akw中正好相反
    习惯:数字不加引号,其他默认一般加双引号
  将命令定义为变量: uname=`pwd`   或者   uname=$( date +%F)
  变量引用: $变量名 或者  ${变量名}  或者  "$变量名" 或者  "${变量名}"
  
8、位置变量
    $0 : 当前脚本文件名,当执行的脚本时使用的是全路径时,则$0包含路径
            拆分路径与名字:dirname $0 ——路径   ; basename $0——获取名字
    $n : 获取传递给当前shell脚本的第n个参数  : n=1...9,如n大于9则需要用大括号: ${10}
    $* : 获取所有参数,将所有参数作为单个字符串
    $# :命令行参数个数
    [email protected] :将命令行每个参数视为独立的单个字符串
9、进程状态变量;
    $? : 取上一个命令执行结果——  0 :正确 ; 非零:错误
    $$ : 取当前shell进程号
10、read函数:
    read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。这种方式可以输入多个字符串,例如定义“.”作为结符号等等。
11、IFS:
     Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符。完整定义是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default,to delimit words for the read and set commands。
      Shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。而 IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。
      
12、介绍下Shell中的${}、##和%%使用范例:
    注意:正则表达式的贪婪与非贪婪匹配

    ${#VALUE}:计算VALUE字符串的字符数量。
    ${VALUE%.*}或${VALUE%%.*}:删除VALUE字符串中以分隔符“.”匹配的右边字符,保留左边字符。
    ${VALUE#*.}或${VALUE##*.}:删除VALUE字符串中以分隔符“.”匹配的左边字符,保留右边字符。
    ${VALUE/OLD/NEW}或${VALUE//OLD/NEW}:用NEW子串替换VALUE字符串中匹配的OLD子串。
    补充:“*”表示通配符,用于匹配字符串将被删除的字串。“.”表示字符串中分隔符,可以为任意一个或多个字符。“%”表示从右向左匹配,“#”表示从左向右匹配,“\”表示替换,都属于非贪婪匹配,即匹配符合通配符的最短结果。与“%”、“#”和“/”类似的有“%%”、“##”和“//”,都属于贪婪匹配,即匹配符合通配符的最长结果。
    ${VALUE:OFFSET}或${VALUE:OFFSET:LENGTH}:从VALUE字符串的左边开始中截取子串。
    ${VALUE:0-OFFSET}或${VALUE:0-OFFSET:LENGTH}:从VALUE字符串的右边开始中截取子串。
    
    可以用${ }分别替换得到不同的值:
    ${file#*/}:删掉第一个/ 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:删掉最后一个/ 及其左边的字符串:my.file.txt
    ${file#*.}:删掉第一个. 及其左边的字符串:file.txt
    ${file##*.}:删掉最后一个. 及其左边的字符串:txt
    ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
    ${file%%/*}:删掉第一个/ 及其右边的字符串:(空值)
    ${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
    ${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
13、Here Document
    Here document以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾
    cmd << delimiter
    Here Document Content
    delimiter(结束符要顶格写)
    它的作用就是将两个 delimiter 之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数。

14、shell基本规范
        a、头行写shell解释器,接着几行加时间、作者、联系方式、版本等信息,这些信息可以在~/.vimrc中模板化
        b、书写时成对的符号先写完(括号,引号),防止遗漏(如[]两边有空格)
        c、流程语句的格式一次完成(if、for、case、while等)
15、shell常用内部命令:
    echo、eval、exec、export、readonly、read、shift、wait、exit、点(.)    
16、变量子串的常用操作:
    %: 从后面开始    # :从前面开始
    ${#string}  —— 返回$string的长度
    ${string:position} ——从position位置开始截取子串(position为偏移量)
    ${string:position:length} ——截取指定长度的串
    ${string#substring}  ——从string开始删除最短匹配substing
    ${string/substring/replace}——使用$replace替换第一个匹配的$substring
    ${string/#substring/replace}——如果string的前缀匹配substring,则用replace替换
    ${string%substring}  ——从string结尾开始删除最短匹配substing
变量替换:
    ${vlaue:-word}   ——变量未定义(不存在或为null),则返回默认值
    ${value:=word}    |  ${value:?"not defined"} | ${value:+word}

17、产生序列:
      “seq -s"," 100”   —— 以逗号为分割,从1打印到100
18、计算变量长度方法:
      ${#string} 或  echo ${string} | wc -m   或  echo $(expr length "$string")
    验证时间(第一种效率最好):
      time for i in (seq 11111);do count=${#chars};done;  
 bash对变量的处理可以通过man bash来查看(看一手资料)
 19、变量的数值计算
     (())——常用,效率高、let、expr、bc——支持浮点运算、$[]
     e.g :   ((a=1+2**3));echo $a   或  a=$((1+2**3))  或 echo $((1+2**3))
           判断:  echo $((3>2))  ——》输出1
     bc是unix下的计算器,在命令行可以直接敲bc进到bc环境做运算,bc常用做法是拼接字符串表达式然后管道给bc;进制转换
     “seq -s"+" 10 | bc”  ——计算1——10的和
     echo "scale=2;5.23/3.21"|bc
20、shell变量的输入
    read [param] [var] 
    常用: -p :设置提示信息 ,-t 设置超时时间(秒)
21、条件测试:
    test <测试表达式>  或 [测试表达式]或[[测试表达式]]
    test -f align.sh.swp && echo 1 || echo 0
    test ! -f align.sh.swp && echo 1 || echo 0  (非)
    双中括号中间支持&& ||操作
    [[ -f file && -d folder ]] && echo 1 || echo 0   : 单中括号实现同样功能需要跟 -a参数
    [ -f file -a -d folder ] && echo 1 || echo 0  (-a、-o、!)
    文件测试操作符:
    -f  文件: 文件存在且为普通文件则真
    -d 文件:文件存在且为目录则真
    -s  文件 : 文件存在且不为空(文件大小不为零)
    -e :文件存在则为真
    -r:文件存在且可读则真
    -w:文件存在且可写则真
    -x:文件存在且可执行则真
    f1 -nt f2 :若文件f1比文件f2新则真
    f1 -ot f2 :若文件f1比f2旧则真
    字符串测试操作符:
    `=` 单等于号与双等于号功能相同`==`  : 比较字符串是否相等(对于$a这样变量比较,最好用双引号括起来)
    -z 字符串 :  字符串长度为零则真
    -n 字符串:字符串长度不为零则真
    整数二元比较操作: 
    在单中括号中(这些操作符不需转义):-ne、-eq、-gt、-lt、-ge    、-le
    在双中括号中可以使用:==、> 、< 、!= 、<= (如果在单中括号中使用则需转义)
    逻辑运算:-a、-o、 !
22、判断字符串是否是数字
    方法1、sed正则表达式
    方法2、变量子串替换加正则表达式
23、监控mysql服务
    1、根据mysql端口(假设默认端口3306)(思路不好,有可能取不到,导致脚本后很多容易bug)
        netstat -lnt|grep 3306 | awk -F ‘[ :]‘ ‘{print $5}‘
        或
       利用wc命令统计(将端口或进程转成数字然后进行判断)
        netstat -lnt|grep 3306 | wc -l     
    2、MySql进程及端口同时存在则认为mysql服务正常
        ps -ef | grep mysqld | grep -v grep | wc -l        (-v grep 排除grep自己)    
        中间启动后,可能需要暂停几十秒(sleep 10) ,在继续判断mysql是否启动成功
        有时候杀进程失败,为了方便可以在while中不断杀进程(killall mysqld),killall杀死同一进程组内的所有进程
    3、利用mysql命令连接mysql,并做相关语句操作以确认mysql确实在运行(判断上述语句是否执行成功):
        mysql -uroot -p‘[email protected]‘ -S  /home/data/3306/mysql.sock  -e "select version();" >/dev/null
    4、利用编程语言写程序连接判断
24、case语句:
     范围中括号:[1-9]  ;  选择或:“|”  ——例如不区分大小写(red|RED)
25、数组
    定义: 利用小括号做边界,元素之间使用空格隔开: array=(1 2 3)
    数组长度:echo ${#array[@]}  | echo ${#array[*]}  (类似字符串长度取法:a=123  len=${#a})
    打印整个数组(去掉#) : echo ${array[*]}
    删除元素: unset 数组[下标],不带下标则删除整个数组
    截取:类似之前的变量截取操作(数组也是一种变量)操作
26、shell调试
    a、dos2unix 处理脚本(存在一个相对的unix2dos) 
        (在windows下写的脚本到linux下后存在编码问题)(此问题可以通过vi脚本来设置脚本的ff属性)
    b、利用echo调试,echo需要调试内容。然后exit 退出脚本,循环往复
    c、使用bash命令参数:sh [-nvx] XX.sh   (-n:做语法检查而不执行;常用是-x参数) (此种方式调试作用域是整个脚本)
        利用set (+)-x 限制需要调试的代码的范围,在set-x 与set +x之间的代码才会被调试
27、shell开发环境配置调优
    .vimrc 文件: 

28、linux系统信号处理
    a、不希望脚本执行时被打断(如 ctrl + c 终止脚本),利用 kill -l(或trap -l)查看系统信号(在signal.h 头文件中)
        信号在之前linux中使用数字表示,但后续新的脚本使用信号名字,使用信号名字时需要省略SIG前缀
    b、trap命令: 表示在接收到信号后的操作


以上是关于linux学习小记 (一 )的主要内容,如果未能解决你的问题,请参考以下文章

arch-linux安装小记(一)

Python小记1(持续更新)

Burnside引理和polay计数学习小记

神经网络学习小记录70——Pytorch 使用Google Colab进行深度学习

Android活动学习小记

Java学习小记 6