zoukankan      html  css  js  c++  java
  • bash 命令行学习笔记

    命令行学习笔记

    该文档为linux bash 命令行学习的笔记摘要,用于记录基本的命令行操作,以及技巧,参考学习链接如下

    https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md

    一、基础

    1.文本编辑器emacs操作笔记

    详见emacs 内置教程

    2.输出输入重定向以及管道命令、标准输入标准输出标准错误

    • 标准输入(stdin) -0 、标准输出(stdout)-1 、标准错误(stderr)-2
    • 标准输入重定向 cat < in.txt
    • 标准输出重定向 覆盖模式:> 追加模式:>>
    • 将标准输出重定向到特定文件 echo "123" > out.txt
    • 将标准错误重定向到特定文件 cmd 2>error.txt
    • 将标准输出和标准错误定向到不同文件 cmd 1>out.txt 2>err.txt
    • 将标准输出和标准错误重定向到同一个文件 cmd >out_err.txt 2>&1
    • /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果,如$ command > /dev/null 2>&1

    3.bash的任务管理工具: &,ctrl-z,ctrl-c,jobs,fg,bg,kill

    • & 表示把任务放在后台运行 python test.py > log.txt & 运行test.py程序,并置于后台运行,日志信息重定向到log.txt
    • ctrl+c 是强制中断程序的执行。
    • ctrl+z 的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态。
    • fg 重新启动被前台中断的任务,把后台的命令调至前台继续运行 fg %job_num
    • bg 将后台中断的进程继续运行
    • jobs 查看当前有多少在后台运行的命令
    • kill 杀掉进程,只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。下面是常用的信号:
    1. HUP 1 终端断线
    2. INT 2 中断(同 Ctrl + C)
    3. QUIT 3 退出(同 Ctrl + )
    4. TERM 15 终止
    5. KILL 9 强制终止
    6. CONT 18 继续(与STOP相反, fg/bg命令)
    7. STOP 19 暂停(同 Ctrl + Z)
    • pgrep 和 pkill 根据名字查找进程或发送信号

    4.利用ssh进行远程登录

    密码登录 ssh -p port username@webserverip
    密钥登录 ssh -i ~/.ssh/id_rsa_1 username@webserverip
    利用ssh-keygen 生成密钥对,公密: ../.ssh/id_rsa.pub 私密:../.ssh/id_rsa 将公密放到服务器

    ssh 配置文件 etc/ssh/sshd_config 设置端口,设置是否允许密码登录、是否需要进行密钥验证等

    Port 32200
    RSAAuthentication yes
    PubkeyAuthentication yes
    

    5.基本的文件管理工具使用

    less、 head、tail、 tail -f、 ln 和 ln -s 、chown、 chmod、 du 、df 、fdisk 、mkfs、 lsblk ,inode
    ln 硬连接
    ln -s 软连接

    6.基本的网络管理工具 ifconfig

    ifconfig 查看网络内容,启动或者关掉网卡,修改网络ip,修改mac地址功能

    7.版本控制工具git

    8.熟悉正则表达式,使用grep,学习参数 -i,-o -v -A -B -C

    grep 命令用于查找文件里符合条件的字符串,参数如下:

    • -i 忽略大小写
    • -o 只显示匹配的内容
    • -v 不匹配符合的内容
    • -A 除了显示匹配的内容之外,还显示该行之前的n行
    • -B 除了显示匹配的内容之外,还显示该行之后的n行
    • -C 除了显示匹配的内容之外,还显示改行前后的n行

    二、日常使用

    1.bash命令操作快捷键

    • ctrl-w 删除你键入的最后一个单词
    • ctrl-u 可以删除行内光标所在位置之前的内容
    • alt-b 和 alt-f 可以以单词为单位移动光标
    • ctrl-a 可以将光标移至行首
    • ctrl-e 可以将光标移至行尾
    • ctrl-k 可以删除光标至行尾的所有内容
    • ctrl-l 可以清屏

    2.历史记录

    键入 history 查看命令行历史记录

    • !n(n 是命令编号)就可以再次执行
    • !$ 它用于指代上次键入的参数
    • !! 可以指代上次键入的命令
    • alt-. 循环地移向前显示历史记录
    • ctrl+r进行历史命令搜索,重复按会向下继续匹配 ,按入enter会执行当前匹配的历史命令

    3.目录操作

    • cd 进行目录切换工作
    • cd ~ 进行家目录
    • cd - 返回前一个工作目录
    • cd .. 返回上一个工作目录

    4.xargs命令

    5.查看进程监听的端口

    使用 netstat -lntpss -plat检查哪些进程在监听端口(默认是检查 TCP 端口; 添加参数 -u 则检查 UDP 端口)
    或者 lsof -iTCP -sTCP:LISTEN -P -n

    netstst部分参数

    • -t (tcp) 仅显示tcp相关选项
    • -u (udp) 仅显示udp相关选项
    • -n 拒绝显示别名,能显示数字的全部转化为数字
    • -l 仅列出在Listen(监听)的服务状态
    • -p 显示建立相关链接的程序名

    查看结果如下:

    # netstst -lntp | grep 32200
    tcp        0      0 0.0.0.0:32200           0.0.0.0:*               LISTEN      492/sshd
    

    6.查看开启的套接字和文件

    lsof(list open files)是一个列出当前系统打开文件的工具。

    lsof 输出各列信息含义:
    字段 含义
    COMMAND 进程名称
    PID 进程标识符
    USER 进程所有者
    FD 文件描述符
    TYPE 文件类型
    DEVICE 指定磁盘名称
    SIZE 文件大小
    NODE 索引节点(文件在磁盘的标识)
    NAME 打开文件的确切名称
    部分lsof命令:
    lsof -i:8080 		#查看8080端口占用
    lsof abc.txt 		#显示开启文件abc.txt的进程
    lsof -c abc 		#显示abc进程现在打开的文件
    lsof -c -p 1234 	#列出进程号为1234的进程所打开的文件
    lsof -g gid 		#显示归属gid的进程情况
    lsof +d /usr/local/ #显示目录下被进程开启的文件
    lsof +D /usr/local/ #同上,但是会搜索目录下的目录,时间较长
    lsof -d 4 			#显示使用fd为4的进程
    lsof -i -U 			#显示所有打开的端口和UNIX domain文件
    

    7.可以把别名、shell 选项和常用函数保存在 ~/.bashrc,这样做的话你就可以在所有 shell 会话中使用你的设定,把环境变量的设定以及登陆时要执行的命令保存在 ~/.bash_profile。而对于从图形界面启动的 shell 和 cron 启动的 shell,则需要单独配置文件。

    8.在 Bash 脚本中,子 shell(使用括号 (...))是一种组织参数的便捷方式。一个常见的例子是临时地移动工作路径,代码如下:

     # do something in current dir
     (cd /some/other/dir && other-command)
     # continue in original dir
    

    9.使用括号扩展({...})来减少输入相似文本,并自动化文本组合。这在某些情况下会很有用

    mv foo.{txt,pdf} some-dir 	#同时移动两个文件 
    cp somefile{,.bak} 			 #会被扩展成 cp somefile somefile.bak#
    mkdir -p test-{a,b,c}/subtest-{1,2,3}	#会被扩展成所有可能的组合,并创建一个目录树
    

    10.使用 man ascii 查看具有十六进制和十进制值的ASCII表。man unicode,man utf-8,以及 man latin1 了解通用的编码信息。

    11.将 web 服务器上当前目录下所有的文件(以及子目录)暴露给你所处网络的所有用户

    python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)
    python -m http.server 7777 (使用端口 7777 和 Python 3)
    

    三、文件以及数据处理

    1.文件查找

    在当前路径下查找 find . -name '*something*'
    在所有路径下通过文件名查找文件,使用locate something
    `

    2.使用 sort 和 uniq,uniq 的 -u 参数和 -d 参数

    sort命令用于将文本文件内容加以排序。

    - -b 忽略每行前面开始出的空格字符。
    - -c 检查文件是否已经按照顺序排序。
    - -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
    - -f 排序时,将小写字母视为大写字母。
    - -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
    - -m 将几个排序好的文件进行合并。
    - -M 将前面3个字母依照月份的缩写进行排序。
    - -n 依照数值的大小排序。
    - -u 意味着是唯一的(unique),输出的结果是去完重了的。
    - -o<输出文件> 将排序后的结果存入指定的文件。
    - -r 以相反的顺序来排序。
    - -t<分隔字符> 指定排序时所用的栏位分隔字符。
    - +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
    - --help 显示帮助。
    - --version 显示版本信息。
    

    uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

    - -c或--count 在每列旁边显示该行重复出现的次数。
    - -d或--repeated 仅显示重复出现的行列。
    - -f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
    - -s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
    - -u或--unique 仅显示出一次的行列。
    - -w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。
    - --help 显示帮助。
    - --version 显示版本信息。
    - [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
    - [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)
    

    当重复的行并不相邻时,uniq 命令是不起作用的,所以uniq命令往往和sort命令一起使用

    3.使用 cut,paste 和 join 来更改文件

    4.运用 wc 去计算新行数(-l),字符数(-m),单词数(-w)以及字节数(-c)

    wc命令用于计算字数,利用wc指令我们可以计算文件的Byte数、字数、或是列数,参数含义如下:

    • -c或--bytes或--chars 只显示Bytes数。
    • -l或--lines 只显示行数。
    • -w或--words 只显示字数,单词数。
    • --help 在线帮助。
    • --version 显示版本信息

    5.使用 tee 将标准输入复制到文件甚至标准输出,例如 ls -al | tee file.txt

    tee命令用于读取标准输入的数据,并将其内容输出成文件

    6.使用 awk 和 sed 来进行简单的数据处理

    AWK是一种处理文本文件的语言,是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

    基本操作语法

    awk -F ':' {pattern + action}' {filenames}
    其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令,-F 指定划分的分隔符,默认是空格

    awk 内置变量
    变量 含义
    ARGC 命令行参数个数
    ARGV 命令行参数排列
    ENVIRON 支持队列中系统环境变量的使用
    FILENAME awk浏览的文件名
    FNR 浏览文件的记录数
    FS 设置输入域分隔符,等价于命令行 -F选项
    NF 浏览记录的域的个数,列数
    NR 已读的记录数,行数
    OFS 输出域分隔符
    ORS 输出记录分隔符
    RS 控制记录分隔符

    变量$0表示整条记录,$1表示当前行的第一个域 $2表示当前行的第二个域 一次类推
    cat /etc/passwd | awk -F ':' '{print $1}' #显示分割后的第一列

    sed 命令利用脚本来处理文本文件

    语法

    sed [-hnV][-e<script>][-f<script文件>][文本文件]
    参数说明:
    -e 以选项中指定的script来处理输入的文本文件。
    -f 以选项中指定的script文件来处理输入的文本文件。
    -h或--help 显示帮助。
    -n或--quiet或--silent 仅显示script处理后的结果。
    -V或--version 显示版本信息。

    动作说明:
    a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
    c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
    d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚
    i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
    p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
    s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

    7.使用 repren 来批量重命名文件,或是在多个文件中搜索替换内容。(有些时候 rename 命令也可以批量重命名,但要注意,它在不同 Linux 发行版中的功能并不完全一样。)

    # 将文件、目录和内容全部重命名 foo -> bar:
    repren --full --preserve-case --from foo --to bar .
    # 还原所有备份文件 whatever.bak -> whatever:
    repren --renames --from '(.*).bak' --to '1' *.bak
    # 用 rename 实现上述功能(若可用):
     rename 's/.bak$//' *.bak
    

    8.shuf 可以以行为单位来打乱文件的内容或从一个文件中随机选取多行

    9.对于二进制文件,使用 hd,hexdump 或者 xxd 使其以十六进制显示,使用 bvi,hexedit 或者 biew 来进行二进制编辑。

    10.拆分文件可以使用 split(按大小拆分)和 csplit(按模式拆分)

    11.使用 getfacl 和 setfacl 以保存和恢复文件权限。

    例如:
    getfacl -R /some/path > permissions.txt
    setfacl --restore=permissions.txt
    

    四、系统调试

    1.获取 CPU 和硬盘的使用状态,通常使用使用 top(htop 更佳),iostat 和 iotop。而 iostat -mxz 15 可以让你获悉 CPU 和每个硬盘分区的基本信息和性能表现。

    2.若要了解内存状态,运行并理解 free 和 vmstat 的输出。值得留意的是“cached”的值,它指的是 Linux 内核用来作为文件缓存的内存大小,而与空闲内存无关。

    3.查看你当前使用的系统,使用 uname,uname -a(Unix/kernel 信息)或者 lsb_release -a(Linux 发行版信息)。

    4.如果你删除了一个文件,但通过 du 发现没有释放预期的磁盘空间,请检查文件是否被进程占用: lsof | grep deleted | grep "filename-of-my-big-file"

    五、单行脚本

    1.当你需要对文本文件做集合交、并、差运算时,sort 和 uniq 会是你的好帮手。此处假设 a 与 b 是两内容不同的文件。这种方式效率很高,并且在小文件和上 G 的文件上都能运用(注意尽管在 /tmp 在一个小的根分区上时你可能需要 -T 参数,但是实际上 sort 并不被内存大小约束),参阅前文中关于 LC_ALL 和 sort 的 -u 参数的部分。

    sort a b | uniq > c   # c 是 a 并 b
    sort a b | uniq -d > c   # c 是 a 交 b
    sort a b b | uniq -u > c   # c 是 a - b
    

    2.使用 grep . (每行都会附上文件名)或者 head -100 (每个文件有一个标题)来阅读检查目录下所有文件的内容。这在检查一个充满配置文件的目录(如 /sys、/proc、/etc)时特别好用

     $ ls hosts out.txt| head -100 *
    
    ==> hosts <==
    192.168.15.1
    192.168.15.1
    awdd
    my name is mike hello
    i am a teacher
    what a stupid gay,fuck!
    
    ==> out.txt <==
    out.txt
    hosts
    
    

    3.要持续监测文件改动,可以使用 watch,例如检查某个文件夹中文件的改变,可以用 watch -d -n 2 'ls -rtlh | tail';或者在排查 WiFi 设置故障时要监测网络设置的更改,可以用 watch -d -n 2 ifconfig。

    4.如果你想在文件树上查看大小/日期,这可能看起来像递归版的 ls -l 但比 ls -lR 更易于理解:

    find . -type f -ls

    5.计算文本文件第三列中所有数的和(可能比同等作用的 Python 代码快三倍且代码量少三倍)

    awk '{ x += $3 } END { print x }' myfile

  • 相关阅读:
    精读大道至简01
    mysql查询语句出现sending data耗时解决
    定位线上问题
    docker命令
    .net core2学习笔记
    centos下安装色彩scrapy
    mysql中id值被重置的情况
    MySql中的SHOW INDEX 查出的结果列代表的意义
    ELK安装
    使用PowerDesigner进行面向对象分析与UML建模(转)
  • 原文地址:https://www.cnblogs.com/mangojun/p/12866625.html
Copyright © 2011-2022 走看看