zoukankan      html  css  js  c++  java
  • Linux-《Linux命令行与shell脚本编程大全》阅读笔记

    1.内核负责的主要功能

      系统内存管理、软件程序管理、硬件设备管理、文件系统管理

    2.GNU工具链

      Linux内核是系统的核心,控制着内存、程序和硬件等是如何与对方交互的。内核还需要工具链来执行一些标准功能,比如控制文件、文本和进程等。

    3.terminfo数据库

      Linux需要知道你模拟的哪个终端,及在和终端模拟器通信时使用哪些控制码,terminfo数据库是一组文件,系统将每种终端类型的terminfo数据作为单独文件存储在terminfo数据库目录(随发行版不同而不同,有可能为/usr/share/terminfo、/etc/terminfo、/lib/terminfo)。特定终端的单独文件被存储在其名称对应的字母目录下,比如/usr/share/terminfo/v里是VT终端模拟器

    4.大多数Linux发行版默认shell都是 GNU bash shell,能够提供对Linux系统的交互式访问,它是作为常规程序运行的,通常都是在用户登录终端时启动。登录时启动的shell依赖于用户账户的配置(/etc/passwd每行的最后一列为启动时默认的shell)。

    5.硬链接相当于变量别名(有相同的索引节点号),一改全改,但是删除一个,另一个还可以访问;软链接相当于快捷方式,当目标文件删除时,快捷方式失效。

    6.启动bash shell有3中方式:

      1).登录时当做默认登录shell

      2).作为非登录shell的交互式shell

      3).作为运行脚本的非交互shell

    7.用户管理命令useradd,userdel,usermod,passwd,chsh;用户组管理命令groupadd,groupdel,groupmod

    8.useradd -D 查看添加用户时的默认配置信息,后跟参数可以修改系统默认配置信息

    $ useradd -D
    GROUP=100 #用户所属组
    HOME=/home #用户家目录所在目录
    INACTIVE=-1 #账号密码过期后是否禁用此用户
    EXPIRE= #过期时间
    SHELL=/bin/bash #用户登录后的默认shell
    SKEL=/etc/skel #系统会将/etc/sekl目录下的文件复制到用户home目录下
    CREATE_MAIL_SPOOL=yes #是否为用户创建一个用于接收邮件的文件

      修改参数

      比如

    useradd -D -s /bin/tsch

    9./etc/passwd,/etc/shadow,/etc/group

    10.sudo

      用来以其他身份来执行命令, 预设的身份为root, 在/etc/sudoers中设置了可执行sudo指令的用户, 若其未经授权的用户企图使用sudo, 则会发出警告的邮件给管理员, 先输入密码, 之后有5分钟的有效期限, 超过期限则必须重新输入密码

      配置sudo必须通过编辑/etc/sudoers文件, 而且只有超级用户才可以修改它, 还必须使用visudo命令编辑, 之所以使用visudo有两个原因, 一是它能够防止两个用户同时修改它, 二是它也能进行有限的语法检查, 所以, 即使只有你一个超级用户, 你也最好用visudo来检查一下语法

    11.read, 如果输入个数多于指定变量的个数, 最后一个指定变量将存放剩余所有输入, 如果没有指定变量, 则把输入存放到 REPLY 全局变量

      -p 指定打印

      -t 设定超时时间

      -s 是否隐藏输入

    12.当使用重定向符号时, Linux会用重定向指定的文件描述符来替换原有文件描述符

    13.大多数Linux操作系统在重启时会自动删除/tmp中的所有文件

    14.所有账户都有权限在/tmp文件夹中读写, 而且不用管理清除

    15./etc/cron.*ly 如果不精确的定时执行, 可以把执行文件放在其目录中, 比如 cron.dayly 目录, 其内文件每天执行一次

    16.

      boot的含义,boot是bootstraps(鞋带)的缩写,启动就好像拎着鞋带把自己提起来那么纠结(Pull oneself up by one's bootstraps),必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序

      按下电源

      BIOS(Basic Input/Output System,是存储在ROM(Read Only Memory)上的一段程序)系统通电自检(Power-On Self-Test即POST)

        1.会检查各种硬件是否正常,比如内存松动就会报错无法启动,如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息

        2.根据我们在BIOS中设置的系统启动顺序(比如Windows中BIOS系统中设置磁盘/CD/DVD/...为第一启动)把控制权转交给排在第一位的储存设备,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备,这最前面的512个字节,就叫做"主引导记录"(Master boot record,缩写为MBR)

        3.就会将MBR内容复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了,以下以grub为例

      启动内核,grub会解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核

      

    init进程,是一个由内核启动的用户级进程,内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。会读取/etc/inittab文件获取运行级别

      rc.d: run control directory

      最先运行的服务是放在/etc/rc.d 目录下的文件

    17.sed(stream editor)被称作流编辑器,与文本编辑器(比如Vim)不同,不是以键盘命令来交互式的插入、删除或替换数据中的文本,而是基于预先提供的一组规则来编辑数据流。

      sed编辑器每次从输入中读取一行,用提供的编辑器命令匹配数据、安命令中制定的方式修改流中的数据,然后将生成的数据输出到STDOUT,在流编辑器将所有命令与一行数据进行匹配完成后,会读取下一行数据并重复这个过程。sed只支持基本正则表达式(BRE)、而不支持扩展正则表达式(ERE,有"问括花管加")。

    sed options script file

      option script 由 "地址范围 + 操作" 组成

      -e script 在处理输入时,将script中制定的命令添加到运行的命令中

      -f file 在处理输入时,将file中制定的命令添加到运行的命令中

      -n 不打印,可以调用p命令打印匹配行

    #s替换(substitute)
    #d删除(delete)
    #c更换(change)
    #y转换(transform)
    #i添加(insert)
    #a添加(append) #p打印(print)
    #n切换到下一行,清空sed编辑器的工作空间,将数据流中的下一文本行移动到其中,空间中只保持一行(next)
    #N多行处理命令,不清空sed编辑器的工作空间,把数据流中的下一行文本添加到空间中,会把将两行当做一行进行处理
    #D多行删除命令,在多行时,只删除空间中的匹配行 sed '/^${N; /header/D}' filename
    #P多行打印命令,在多行时,p只打印多行工作空间中的第一行,P打印多行
    #h将模式空间复制到保持空间(hold space)
    #H将模式空间附加到保持空间
    #g将保持空间复制到模式空间
    #G将保持空间附加到模式空间
    #x交换模式空间和保持空间的内容 sed -n '/first/{h;p;n;p;g;p}' #w写入文件(
    write)
    #l打印不可见字符(list) #寻址方式(address) #
    "行号", $表示末尾行 #"行号,行号" #"/匹配行/" #"/匹配行/,/匹配行/" #插入以下的i可以更改为a,i、a分表表示address前和后插入 #[address]i ewline #删除 #[address]d #修改行 #[address]c ewline #多行时会合并为一行newline #替换行 #[address]s/oldchars/newchars/ #转换行 #[address]y/inchars/outchars/ #指定行多命令模式 #[address]{command1; command2; command3}

    #对匹配行的下一行进行操作
    #[address]{n;d} #删除匹配行的下一行

    #对匹配行和下一行进行操作,即当成一行来处理
    #[address]{N;s/ / /} #合并匹配行和下一行
    #sed 'N;s/System.Administrator/Desktop User/' filename #查找和替换被分隔成两行的两个单词

    #每行多命令模式
    #-e 'command1; command2'

    #向文件写入
    #[address]w filename

    #从文件中读取,其中address只能是行号或者匹配,不能是范围
    #[address]r filename #注意是单引号,注意最后的
    "/" echo "This is the test" |sed 's/test/big test/' #多条命令用 -e 选项,并且用 ";" 隔开 echo "This is the test" |sed -e 's/This/That/; s/test/big test/' #从文件中读取命令 echo "This is the test" |sed -f 'mysed.script' #处理指定数量行 echo "This is the test" |sed '1s/test/big test/' #处理指定匹配行 echo "This is the test" |sed '/test/s/test/big test/' #在单行上执行多条处理命令 echo "This is the test" |sed "1{s/This/That/; s/test/big test/}" #删除行 sed 1d filename #删除1行 sed 2,3d filename #删除2-3行 sed 6,$ filename #删除从6行到结尾行 sed /test/d filename #删除匹配行 sed /test1/,/test2/d filename #删除两个匹配行之间的行 #添加行 echo 'aaaaa' |sed 'ibbbb' #在前插入一行 注意此处是反斜线 echo 'aaaaa' |sed 'abbbb' #在后插入一行 sed '3ibbbb' filename #在第3行前插入一行 sed '3abbbb' filename #在第3行之后插入一行 sed '$ibbbb' filename #在最后一行之前插入一行 sed '$abbbb' filename #在最后一行之后插入一行 #修改行 sed '3cThis is a changed line of text' filename #把文件的第三行修改为如上内容 sed '/test/cThis is a changed line of text' filename #把文件中所有能匹配"test"的行替换为如上内容 sed '2,3cThis is a new line of text' filename #把2~3行替换为一行如上内容 #转换 sed 'y/123/789/' filename #把文件中每一行中1、2、3分别转换为7、89 #打印指定行 sed -n '2,6p' filename sed -n '/3/{p; s/line/test/p}' filename #含有数字3的 #打印行,并且列出不可打印的ASCII字符 sed -n 'l' filename #This line contains tabs.$ #向文件中写入 [address]w filename sed '2,3w mydata.txt' filename #从文件中读取 [address]r filename sed '3r mydata.txt' filename

    18.awk 提供一个类编程环境,修改和重新组织文件中的数据,它提供了一种编程语言而不只是编辑器命令,相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题

    awk options program file

      option program 格式为 "BEGIN{xxx}expr{xxxx}expr{xxx}...END{xxx}"

      -F 指定分隔符

      -v var=value 将外部变量传入,也可以直接使用 '$varname',注意变量外必须带上单引号!

      -f 将file中制定的命令添加到运行的命令中

      变量: $0表示本行数据,$1表示第一个字段,也可以修改,如下:

    echo "My name is Rich" | awk '{$1="Chinese"; print $1;}'
    awk options 'BEGIN{...}pattern{...}END{...}' file
      '  '          引用代码块
      BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
      模式分为三种,既能当匹配条件,也能当执行条件:
        1).正则表达式匹配 /xxx/
        2).关系表达式 条件操作符<、<=、==、!=、>=
        3).模式匹配表达式 ~匹配正则表达式、!~不匹配正则表达式
    匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四个域包含ASIMA,就打印整条
    精确匹配:awk '$3=="48" {print $0}' temp    只打印第3域等于"48"的记录,防止字符串与变量混淆,字符串使用""
    不匹配:  awk '$0 !~ /ASIMA/' temp      打印整条不包含ASIMA的记录
    不等于:  awk '$1 != "asima"' temp
    小于:    awk '{if ($1<$2) print $1 "is smaller"}' temp
    设置大小写: awk '/[Gg]reen/' temp      打印整条包含Green,或者green的记录
    任意字符: awk '$1 ~/^...a/' temp    打印第1域中第四个字符是a的记录,符号’^’代表行首,符合’.’代表任意字符
    或关系匹配: awk '$0~/(abc)|(efg)/' temp   使用|时,语句需要括起来
    AND与关系:  awk '{if ( $1=="a" && $2=="b" ) print $0}' temp
    OR或关系:   awk '{if ($1=="a" || $1=="b") print $0}' temp
      {}           命令代码块,包含一条或多条命令
      ;          多条命令使用分号分隔
      END      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
     
      $0           表示整个当前行
      $1           每行第一个字段
      NF          字段数量变量
      NR          每行的记录号,多文件记录递增
      FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
                  制表符
                 换行符
      FS          BEGIN时定义分隔符
      RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
      ~            匹配,与==相比不是精确比较
      !~           不匹配,不精确比较
      ==         等于,必须全部相等,精确比较
      !=           不等于,精确比较
      &&      逻辑与
      ||             逻辑或
      +            匹配时表示1个或1个以上
      /[0-9][0-9]+/   两个或两个以上数字
      /[0-9][0-9]*/    一个或一个以上数字
      FILENAME 当前处理的文件名
      ARGIND 当前处理的文件的顺序编号( awk 'xxxx' file1 file2)
      ARGV 类似 C 中的 argv,ARGV[n] 表示第 n 个参数
      OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
      ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
      -F'[:#/]'   定义三个分隔符
     
      next 直接执行下一行循环
    #只会打印偶数行(没有用if)
    awk 'NR%2==1{next}{print NR,$0;}' text.txt 
      getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入,它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。
    awk 'BEGIN{ "date" | getline out; print out }' test

      输出重定向

    echo | awk '{print ("hello word!n") > "datafile"}'echo | awk '{printf("hello word!n") >> "datafile"}'
    #注意:重定向符号后面的文件名必须带上双引号,因为awk类型中是字符串
    awk '{print > "file"}' file

      把shell中的变量带入awk中执行

    a=10
    awk 'BEGIN{print '$a'}'

      把 /etc/passwd 中的第二列 "x" 改为 /etc/shadow 中的用户密码

    awk 'BEGIN{OFS=FS=":"}NR=FNR{a[$1]=$2}NR>FNR{$2=a[$1]; print}' /etc/shadow /etc/passwd

      continue,break 用于 for in,for,while 等循环

      exit 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。   

      a in array,判断 a键名是否在array中

      字符串函数:sub、gsub、lenth、index、match、split、substr、tolower、toupper、sprintf

      时间函数:systime()、mktime(YYYY mm dd HH MM ss)、strftime(format[, timestamp])

    19.后台任务

      后台任务有两个特点:

        1.继承当前 session (对话)的标准输出(stdout)和标准错误(stderr),因此,后台任务的所有输出依然会同步地在命令行下显示

        2.不再继承当前 session 的标准输入(stdin),你无法向这个任务输入指令了,如果它试图读取标准输入,就会暂停执行(halt)

      可以看到,”后台任务”与”前台任务”的本质区别只有一个:是否继承标准输入,所以,执行后台任务的同时,用户还可以输入其他命令

      Linux系统是这样设计的:

        1.用户准备退出 session

        2.系统向该 session 发出SIGHUP信号

        3.session 将SIGHUP信号发给所有子进程

        4.子进程收到SIGHUP信号后,自动退出

      上面的流程解释了,为什么”前台任务”会随着 session 的退出而退出:因为它收到了SIGHUP信号

      那么,”后台任务”是否也会收到SIGHUP信号?  这由 Shell 的huponexit参数决定的

    shopt |grep huponexit

      大多数Linux系统,这个参数默认关闭(off),因此,session 退出的时候,不会把SIGHUP信号发给”后台任务”,所以,一般来说,”后台任务”不会随着 session 一起退出

      通过”后台任务”启动”守护进程”并不保险,因为有的系统的huponexit参数可能是打开的(on),更保险的方法是使用disown命令,它可以将指定任务从”后台任务”列表(jobs命令的返回结果)之中移除,一个”后台任务”只要不在这个列表之中,session 就肯定不会向它发出SIGHUP信号

    # 移出最近一个正在执行的后台任务
    $ disown
    
    # 移出所有正在执行的后台任务
    $ disown -r
    
    # 移出所有后台任务
    $ disown -a
    
    # 不移出后台任务,但是让它们不会收到SIGHUP信号
    $ disown -h
    
    # 根据jobId,移出指定的后台任务
    $ disown %2
    $ disown -h %2

      使用disown命令之后,还有一个问题,那就是,退出 session 以后,如果后台进程与标准I/O有交互,它还是会挂掉,这是因为”后台任务”的标准 I/O 继承自当前 session,disown命令并没有改变这一点,一旦”后台任务”读写标准 I/O,就会发现它已经不存在了,所以就报错终止执行,为了解决这个问题,需要对”后台任务”的标准 I/O 进行重定向

    python test.py>result 2>&1

      还有比disown更方便的命令,就是nohup

      nohup命令会对进程做三件事

        1.阻止SIGHUP信号发到这个进程

        2.关闭标准输入,该进程不再能够接收任何输入,即使运行在前台

        3.重定向标准输出和标准错误到文件nohup.out。

      也就是说,nohup命令实际上将子进程与它所在的 session 分离了,但是,nohup命令不会自动把进程变为”后台任务”,所以必须加上&符号

      另一种思路是使用 terminal multiplexer (终端复用器:在同一个终端里面,管理多个session),典型的就是 Screen 命令和 Tmux 命令,它们可以在当前 session 里面,新建另一个 session,这样的话,当前 session 一旦结束,不影响其他 session,而且,以后重新登录,还可以再连上早先新建的 session

      除了专用工具以外,Linux系统有自己的守护进程管理工具 Systemd ,它是操作系统的一部分,直接与内核交互,性能出色,功能极其强大,我们完全可以将程序交给 Systemd ,让系统统一管理,成为真正意义上的系统服务

    查看环境变量

    env

    系统提示符变量

    PS1

    查看当前内存详细信息

    cat /proc/meminfo

    查看文件类型

    file filename

    查看文件详细信息

    stat filename

    a

  • 相关阅读:
    【题解】LOJ #6488 数表【FWT】
    【题解】[Comet OJ Contest #11 F] arewell【子集卷积】
    【CF757F】 Team Rocket Rises Again 【支配树】
    支配树学习笔记
    JS模拟实现题目(new debounce throwee 等)
    React生命周期
    js转义符
    CSS3中的transform转换属性
    animation动画
    flex
  • 原文地址:https://www.cnblogs.com/JohnABC/p/4772564.html
Copyright © 2011-2022 走看看