美文网首页
命令行的艺术

命令行的艺术

作者: oasis_m | 来源:发表于2020-03-30 15:18 被阅读0次

    声明:所有文章只作为学习笔记用,转载非原创

    每天一个命令
     http://einverne.github.io/post/2020/03/the-art-of-command-line.html 
    
    
    
    需要知道的重要一点是,在你的 Linux 系统上总会有很多可用的模块,并且如果你可以深入其中了解到很多细节。
    
    命令的基本格式:
     https://www.geek-share.com/detail/2607454512.html 
    #码表 ascii gbk utf8 代表字符在计算机中的表示方式i
    
    $ Command   Option    Arguments
    option 选项   arguments 参数   https://blog.csdn.net/foreverzili/article/details/81501408 
    
    #命令行快捷键 set -o set +o - 表示开启这个选项,+ 表示关闭这个选项。
     https://www.cnblogs.com/betterquan/p/11456820.html
     https://www.jianshu.com/p/74a9be3f8607  #set 命令
    
    #命令行出backspace ^H 
     https://www.cnblogs.com/wildmonk3y/p/4798610.html
    stty erase ^H
    stty erase ^?
    
    
    命令的选项用于调整命令功能,而命令的参数是这个命令的操作对象。
      语法里面:
      • [] 可选内容
      • <> 必选内容
      • a|b 二选一
      • { } 分组
      • ... 同一内容可出现多次
        特殊:rsync 一个冒号的用法类似于scp,是直接通过ssh协议连接到服务器上,从remote的shell上建立通道,发送数据。 两个冒号的用法是说服务器将rsync作为服务启动,这样协议不再是ssh,而是走的rsync协议,两个冒号跟的是rsync服务配置的路径模块。
    
     https://www.cnblogs.com/sohuhome/p/9913224.html 
     简单常用命令 https://www.cnblogs.com/59111618qq/p/10069393.html 
     特殊字符 https://www.cnblogs.com/blog-tim/p/11736206.html 
    
    选项是包括一个或多个字母的代码,它前面有一个减号(减号是必要的,Linux用它来区别选项和参数),选项可用于改变命令执行的动作的类型。
    $ ls -l    
    total 2    
    -rw-r--r-- 2 wzh book 22 Apr 20 20:37 motd    
    -rw-r--r-- 2 wzh book 796 Apr 20 20:37 passwd  
    
    加入-l选项,将会为每个文件列出一行信息,诸如数据大小和数据最后被修改的时间。
    ls -l test # test 为参数 ,有些命令是需要接受多个参数的 例如 cp  
    
    命令行实际上是可以编辑的一个文本缓冲区,在按回车之前,可以对输入的文本进行编辑。比如利用BACKSPACE键可以删除刚键入的字符,可以进行整行 删除,还可以插入字符,使得用户在输入命令,尤其是复杂命令时,若出现键入错误,无须重新输入整个命令,只要利用编辑操作,即可改正错误。
    

    命令行艺术

    #开头
    https://cloud.tencent.com/developer/article/1441454
    https://blog.csdn.net/qdujunjie/article/details/44983291  特殊字符\r\n 
    冒号: 特殊意        --:   特殊意义   -stdin -stdout : 特殊意思
    
    命令练习 https://cloud.tencent.com/developer/article/1354146 
    如何记住命令选项 https://www.zhihu.com/question/21690166/answer/66721478 
    
    /dev/console  --物理终端
    /dev/tty#[1-6]  --虚拟终端
    /dev/ttyS#    --串行终端
    /dev/pts/#     --伪终端
    
    # / : 最初起点 --倒置树状结构
    /dev/pts/2   -- 最左侧的/ : 表示根目录  其它的/ : 表示路径分隔符   windows 是 \
    绝对路径:从根开始
    相对路径:从当前位置表示的路径
    
    # basename  dirname 
    basename: 最右侧的文件或目录名 
    dirname: basename左侧的路径
    
    ------------------------------
    
    ethtool mii-tool  https://cloud.tencent.com/developer/article/1555636 
    
    
    
    #tr 命令转换或删除文件中的字符
    cat a | tr -s '\n'   #删除a 文件中的空行
    cat a | tr -d 4
    cat file | tr [a-z] [A-Z] > test_file   #小写转大写
    
    #  横杠减号 - 作用 -- 
    tar -cvf - /home | tar -xvf -  
    #常常会使用到前一个命令的 stdout 作为这次的 stdin
    #我将 /home 里面的文件给他打包,但打包的数据不是纪录到文件,而是传送到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf -
    创建 -a 文件名  #
    rm -- -a #删除 -开头的文件名
    # 012的应用 read  echo 
    cat test.sh | while read line  #cat 命令的输出作为read命令的输入,read读到的值放在line中
    
    #lsof   
     https://www.cnblogs.com/technologylife/p/9211289.html 
    
    
     http://blog.itpub.net/31397003/viewspace-2147485 
    lsof -i -n 搭配 ,-n 不解析
     # lsof +D /usr/lib
    加上+D参数,lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢
    
    3.19 列出所有与某个描述符关联的文件
    
    # lsof -d 2
    这个命令会列出所有以描述符2打开的文件。
    你也可以为描述符指定一个范围:
    # lsof -d 0-2
    这会列出所有描述符为0,1,2的文件。
    -d选项还支持其它很多特殊值,下面的命令列出所有内存映射文件:
    # lsof -d mem
    txt则列出所有加载在内存中并正在执行的进程:
    # lsof -t -i
    -t选项输出进程的PID,你可以将它和-i选项组合输出使用某个端口的进程的PID,下面的命令将会杀掉所有使用网络的进程:
    # kill -9 'lsof -t -i'
    
    # lsof -i -P +c 0 +M | grep -i "$1"
    #  lsof pass 
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
    tail    3074 root    3r   REG  253,0     2581 34616445 pass
     #cat /proc/3074/fd/3 
    # lsof -c apache 等同于 # lsof | grep foo
    -c选项限定只列出以apache开头的进程打开的文件:
    # lsof -p 450,980,333
    #lsof -i :25 lsof -i tcp:80
    # lsof -a -u hacker -i
    使用-a将-u和-i选项组合可以让lsof列出某个用户的所有网络行为。
    
    lsof 
     http://blog.itpub.net/31397003/viewspace-2147485/ 
    输出结果https://blog.csdn.net/zhailihua/article/details/78534245 
    https://www.cnblogs.com/hojor/p/3411825.html
    (1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
    
    (2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
    (12)rtd:root directory;
    
    lsof `which httpd` //那个进程在使用apache的可执行文件 lsof /etc/passwd //那个进程在占用/etc/passwd lsof /dev/hda6 //那个进程在占用hda6 lsof /dev/cdrom //那个进程在占用光驱 lsof -c sendmail //查看sendmail进程的文件使用情况 lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn lsof -p 30297 //显示那些文件被pid为30297的进程打开 lsof -D /tmp 显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列
    lsof -u1000 //查看uid是100的用户的进程的文件使用情况 lsof -utony //查看用户tony的进程的文件使用情况 lsof -u^tony //查看不是用户tony的进程的文件使用情况(^是取反的意思) lsof -i //显示所有打开的端口 lsof -i:80 //显示所有打开80端口的进程 lsof -i -U //显示所有打开的端口和UNIX domain文件 lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接 lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新) lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不将IP转换为hostname,缺省是不加上-n参数
    
    #cp 
    \cp source target, 强制复制
    -n 忽略同名文件
    
    #你需要对文本文件做集合交、并、差运算时,sort 和 uniq 会是你的好帮手
    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
    
    ##  LC_ALL=C的含义  https://www.cnblogs.com/wajika/p/6592659.html 
    LC_ALL > LC_* >LANG
    export LC_ALL=C 来忽略掉国际化并按照字节来判断顺序。
    
    #proc  目录的理解   man proc 详细介绍了各目录的使用
    学会使用 /proc。它在调试正在出现的问题的时候有时会效果惊人。比如:/proc/cpuinfo,/proc/meminfo,/proc/cmdline,/proc/xxx/cwd,/proc/xxx/exe,/proc/xxx/fd/,/proc/xxx/smaps(这里的 xxx 表示进程的 id 或 pid)
    
    #了解 strace ltrace 用法
     https://blog.csdn.net/u012421852/article/details/51813411 
     https://www.cnblogs.com/lidabo/p/5630085.html 
     https://www.sohu.com/a/220765293_495675 #strace 能帮我们做哪些工作
     在Linux系统上,应用代码通过glibc库封装的函数,间接使用系统调用。
       strace ls 
       strace -c 
    Linux内核目前有300多个系统调用,详细的列表可以通过syscalls手册页查看。这些系统调用主要分为几类: 
     man syscalls 可以详细查看系统调用的类型。
    
    文件和设备访问类 比如open/close/read/write/chmod等
    进程管理类 fork/clone/execve/exit/getpid等
    信号类 signal/sigaction/kill 等
    内存管理 brk/mmap/mlock等
    进程间通信IPC shmget/semget * 信号量,共享内存,消息队列等
    网络通信 socket/connect/sendto/sendmsg 等其他 strace常用选项: 
    strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489   #示例跟踪进程
    strace -tt -T -f -e trace=file -o /data/log/strace.log -s 1024 ./nginx     #跟踪nginx 访问哪些文件
    -t 时间
    -tt 更精细的时间展示
    -c 列表形式展示调用
    -e 可以指定系统调用
    
    
    #了解如何运用 gdb 连接到一个运行着的进程并获取它的堆栈轨迹。(挺难啊)
     http://witmax.cn/gdb-usage.html 
     https://blog.csdn.net/chen1415886044/article/details/105094688/ 
    
    #模块
     https://www.cnblogs.com/flintlovesam/p/5909782.html 
    lsmod 的主要用途之一是在系统不能正常工作时检查模块。然而,大多数情况下,模块会根据需要加载的,而且用户不需要知道它们如何运作。
    内核百模块是可以按需加度载或卸载的内核代码,可知以不道重启系统就扩充版内核的功能 
    内核模块是可以根据需要加载到内核中或从内核中卸载的代码块,因此无需重启就可以扩展内核的功能。事实上,除非用户使用类似 lsmod 这样的命令来查询模块信息,否则用户不太可能知道内核发生的任何变化。
     modprobe sb  #probe 探测
                             modprobe -c | wc -l  可用模块
    lsmode :列出已经被内核调入的模块
    insmode:将某个module插入到内核中
    rmmod:将某个module从内核中卸载
    depmod: 生成依赖文件,告诉将来的 insmod 要从哪儿调入 modules。这个依赖文件就在/lib/modules/[您的kernel版本]/modules.dep。
    Kerneld:负责自动的将模块调入内核和把模块从内核中卸载。
    
    #查看动态库加载 
     https://www.cnblogs.com/tankblog/p/6780146.html 
    一、什么是库
    本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行
    Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。Linux系统有几个重要的目录存放相应的函数库,如/lib    /usr/lib。
     libxxx.a;利用静态函数库编译成的文件比较大
     libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里的相应函数
    
    安全的方法 objdump  pldd  http://blog.chinaunix.net/uid-22780578-id-4008731.html 
    ldd [options] file    列出file运行所需的共享库
        [options]
        -d    执行重定位并报告所有丢失的函数
        -r    执行对函数和对象的重定位并报告丢失的任何函数或对象
     ldconfig [options] [libs]    决定位于目录/usr/lib和/lib下的共享库所需的运行的链接,这些链接由[libs]指定并被保存到/etc/ld.so.conf中
        [options]
        -p    打印文件/etc/ld.so.conf的内容
        -v    更新/etc/ld.so.conf
    
    
    #scp 命令 https://www.cnblogs.com/davidesun/p/11980317.html 
    
    
    # 复杂网络调试
    wireshark,tshark 和 ngrep 可用于复杂的网络调试
    
    
    #ab 工具(Apache 中自带)可以简单粗暴地检查 web 服务器的性能。对于更复杂的负载测试,使用 ----siege
    
    #mtr命令
    使用 mtr 去跟踪路由,用于确定网络问题。
    当网络链路出现问题时很多人会用ping命令,可以简单的测试网络的连通性,看下丢包率,但是却无法确定是在哪里出现了问题;有些人就会用tracert命令来查看路由,或者用nslookup命令来查看DNS是否可用;如果你也觉得这三个命令太麻烦的话,那就用mtr吧
    
    
    #kill -3 <pid>  JDK 中的 jps,jstat,jstack,jmap 很有用
    同时一个完整的栈轨迹和堆概述(包括 GC 的细节)会被保存到标准错误或是日志文件。
    
    #内存查看
    若要了解内存状态,运行并理解 free和 vmstat 的输出。值得留意的是“cached”的值,它指的是 Linux 内核用来作为文件缓存的内存大小,而与空闲内存无关。
    
    #dstat 
    在你想要对系统的现状有一个粗略的认识时是非常有用的。
    然而若要对系统有一个深度的总体认识,使用 glances,它会在一个终端窗口中向你提供一些系统级的数据。
    Glances+InfluxDB+Grafana  https://blog.csdn.net/u012230668/article/details/90807735 
    glances 启动报错 _curses.error: use_default_colors() returned ERRhttps://www.jianshu.com/p/5af313998df2  
    
    #ss netstat 
    使用 netstat 和 ss 查看网络连接的细节。
    cat /proc/net/tcp
    --------------------------netstat中的各种状态------------------------------
    CLOSED         初始(无连接)状态。
    LISTEN         侦听状态,等待远程机器的连接请求。
    SYN_SEND       在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
    SYN_RECV       在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
    ESTABLISHED    完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
    FIN_WAIT_1     在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
    FIN_WAIT_2     在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
    TIME_WAIT      在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
    CLOSING        在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
    CLOSE_WAIT     在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
    LAST_ACK       在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
     
    主动连接端可能的状态有:    CLOSED        SYN_SEND        ESTABLISHED
    主动关闭端可能的状态有:    FIN_WAIT_1    FIN_WAIT_2      TIME_WAIT
    被动连接端可能的状态有:    LISTEN        SYN_RECV        ESTABLISHED
    被动关闭端可能的状态有:    CLOSE_WAIT    LAST_ACK        CLOSED
     
    在Linux下,如果连接数比较大,可以使用效率更高的ss来替代netstat。
    查看tomcat的并发数:netstat -an|grep 10050|awk '{count[$6]++} END{for (i in count) print(i,count[i])}'
    
    
    #top htop iostat iotop 
    iotop 详细琢磨琢磨 https://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247484585&idx=1&sn=6f49154c7f53025a616953803d5cd403&chksm=eac52580ddb2ac96d2446a3cfe3d121720e9e103224b85bb377cf277f7714e4d324d1dc2281e&mpshare=1&scene=1&srcid=1007s2mAwfKam3A2UidICBJ3#rd 
    
    获取 CPU 和硬盘的使用状态,通常使用使用 top(htop 更佳),iostat 和 iotop。而 iostat -mxz 15 可以让你获悉 CPU 和每个硬盘分区的基本信息和性能表现。
    iostat https://www.cnblogs.com/yangxiaoyi/p/7545368.html
    avgrq-sz 平均请求扇区的大小
    avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。 
    await: 平均I/O响应时间,包括在驱动请求队列里等待和设备的I/O响应时间(ms)。一般地系统I/O响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
    svctm:磁盘设备的I/O平均响应时间(ms)
    
    #curl  curl 和 curl -I 可以被轻松地应用于 web 调试中,它们的好兄弟 wget 也是如此
    请求头:H,A,e
    响应头:I,i,D
    cookie:b,c,j
    传输:F(POST),G(GET),T(PUT),X
    输出:o,O,w
    断点续传:r
    调试:v,--trace,--trace-ascii,--trace-time
    
    
    
    
    #清空文件的五种方式
    https://www.cnblogs.com/oxspirt/p/9049629.html 
    1 通过重定向到 Null 来清空文件内容
       > test.log
    2 使用 ‘true' 命令重定向来清空文件
         : 符号,它是 shell 的一个内置命令,等同于 true 命令,它可被用来作为一个 no-op(即不进行任何操作)
         : > test.log
         true > test.log
     3 使用 cat/cp/dd 实用工具及 /dev/null 设备来清空文件
       cat /dev/null > test.log
       cp /dev/null test.log
       dd if=/dev/null of=access.log
    4 使用 echo 命令清空文件
         echo "" > test.log
        或者
        echo > test.log
     注意:你应该记住空字符串并不等同于 null 。字符串表明它是一个具体的事物,只不过它的内容可能是空的,但 null 则意味着某个事物并不存在。基于这个原因,当你将 echo命令 的输出作为输入重定向到文件后,使用cat命令来查看该文件的内容时,你将看到一个空白行(即一个空字符串)。
    
    要将 null 做为输出输入到文件中,你应该使用 -n 选项,这个选项将告诉 echo 不再像上面的那个命令那样输出结尾的那个新行。
    # echo -n "" > test.log
    ----https://www.linuxidc.com/Linux/2012-08/67010.htm  trailing newline 尾随换行符
    5 使用 truncate 命令来清空文件内容
    truncate 可被用来将一个文件缩小或者扩展到某个给定的大小。
    你可以利用它和 -s 参数来特别指定文件的大小。
     truncate -s 0 access.log
    
    #创建文件 
    在Linux系统上快速创建一个大文件  https://www.orcode.com/question/33883_k88962.html 
    
    为了高效地创建空文件,请使用 truncate(创建稀疏文件),fallocate(用于 ext4,xfs,btrf 和 ocfs2 文件系统),xfs_mkfile(适用于几乎所有的文件系统,包含在 xfsprogs 包中),mkfile(用于类 Unix 操作系统,比如 Solaris 和 Mac OS)。
    #创建一个10G文件
    fallocate -l 10G gentoo_root.img
    但那是因为它创建了一个“稀疏文件”。本质上,稀疏文件是具有大量相同数据的磁盘的一部分,并且底层文件系统通过不真正存储所有数据来“欺骗”,而只是“假装”它就在那里。
    #getfacl setfacl
    使用 getfacl 和 setfacl 以保存和恢复文件权限。例如:
       getfacl -R /some/path > permissions.txt
       setfacl --restore=permissions.txt
    
    #chattr +i
    对一些系统文件进行设置(加固)
    
    #查看压缩文件中的内容
    使用 zless、zmore、zcat 和 zgrep对压缩过的文件进行操作 压缩前为文本文件,可以用zcat/zmore/zless读取文件内容。
    bzcat
    https://www.cnblogs.com/evolve/p/9225048.html
    https://www.jianshu.com/p/a19f29a8e3a3 
    
    #编码转换
    使用 iconv 更改文本编码。需要更高级的功能,可以使用 uconv,
    
    #string命令
    同样对于二进制文件,strings(包括 grep 等工具)可以帮助在二进制文件中查找特定比特。
    
    #制表符号
    Bash 命令行中写 tab 制表符,按下 ctrl-v [Tab] 或键入 $'\t'
    
    #rsync 是一个快速且非常灵活的文件复制工具。
    用 rsync 代替 scp 可以实现文件续传,而不用重新从头开始。
    
    #拆分文件可以使用 split(按大小拆分)和 csplit(按模式拆分)。
     https://www.cnblogs.com/jkin/p/10330369.html 
    dd if=/dev/zero bs=100k count=1 of=date.file
    split -b 10k date.file  #按照10K大小分割
    
    
    #对于二进制文件,使用 hd,hexdump或者 xxd 使其以十六进制显示,使用 bvi,hexedit 或者 biew 来进行二进制编辑。
    
    #strings(包括 grep 等工具)
    
    #如果你想在 Bash 命令行中写 tab 制表符,按下 ctrl-v [Tab] 或键入 $'\t'(后者可能更好,因为你可以复制粘贴它)
    
    #sort  ort默认是按照升序排序
    -r -n -k -t sort排序的时候,可以按字段分割的数据进行排序。-t参数表示行的分割字符,-k表示第几列
    例如,以第二个域为主关键字,第一个域为次关键字进行排序,你可以使用 sort -k1,1 | sort -s -k2,2。
    http://blog.chinaunix.net/uid-10540984-id-313479.html 
    https://www.jianshu.com/p/c4d159a98dd8  
    -k 按照域来排序 
    -k 1.2,这就表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。
    #sort  -r 当做字符排序
              -nr 按照整个数字来排序
    sort  testfile4
    1
    11
    12
    2
    22
    3
    33
    4
    44
    
    #uniq -u -d 
    sort 和 uniq,包括 uniq 的 -u 列出出现一次的行 和 -d  列出重复行  
    
    #加进度
    rsync --progress
    dd status=progress。
    
    #shuf 提取一个文件的行数到另外一个文件
    shuf input.txt -n 20 -o output.txt
    
    #scp rsync
    mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
    
    #perl
    perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
    
    
    #Linux 中"-"有特殊的含义,比如在命令的后面加"-"表示后面跟的是选项。但是如何新建带名字中有"-",下面介绍三种方法,比如要新建 文件 "-a":
    
    1、cd .>-a
    2、vi -- -a   rm -- -a | rm ./-a
    3、echo"">-a
    
    
    # shell 赋值 ---- 括号用法
    https://blog.51cto.com/12630492/2154936 
    https://www.jianshu.com/p/7fd317a45be5 
    
    需要注意的是 Shell 默认赋值是字符串赋值,因此进行下面的操作:
    myAgeAdd=$myAge+1
    echo $myAgeAdd
    会输出:
    29+1
    
    
    
    #  column 
    mount | column -t 创建表格
                              -s 分隔符号
    
    #/dev/urandom 随机数
    dd if=/dev/urandom of=random.dat bs=1024b count=1 
    
    #awk sed  来进行简单的数据处理。 参阅 One-liners 获取示例。
    
    #export LC_ALL=C 的意义LC_ALL=C 是为了去除所有本地化的设置,让命令能正确执行
    
    #tee 将标准输入复制到文件甚至标准输出,例如 ls -al | tee file.txt
    
    #wc 去计算新行数(-l),字符数(-m),单词数(-w)以及字节数(-c)
    
    #join  paste 
    join  https://www.cnblogs.com/sunshineKID/p/3593540.htm
    注:这两个文件必须在已经在此列上是依照同样的规则进行了排序。
    paste -s ( 串列进行而非平行处理) 合并两个文件
    
    #sed -n l testfile2  
       l 小写l  列出非打印字符
    
    #cut命令主要是接受三个定位方法: -d  分隔符
    第一,字节(bytes),用选项-b     支持这种 3-5 -3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。
    第二,字符(characters),用选项-c
    第三,域(fields),用选项-f
    
    
    
    
    
    
    #diff comm 
     https://www.cnblogs.com/wangqiguo/p/5793448.html 
     diff 结果解读  a=add,c=change,d=delete
     diff -c 结果比较直观  -u
          -r 和 -q 比较目录
    #工具  
    当你要处理棘手的 XML 时候,xmlstarlet 算是上古时代流传下来的神器。
    使用 jq 处理 JSON。
    使用 shyaml 处理 YAML。
    要处理 Excel 或 CSV 文件的话,csvkit 提供了 in2csv,csvcut,csvjoin,csvgrep 等方便易用的工具。
    当你要处理 Amazon S3 相关的工作的时候,s3cmd 是一个很方便的工具而 s4cmd 的效率更高。Amazon 官方提供的 aws 以及 saws 是其他 AWS 相关工作的基础,值得学习。 
    pandoc 可以生成 makedown 
    
    # lynx -dump -stdin 是纯文本模式的网页浏览器,不支持图形、音视频等多媒体信息
    
    
    #grep 外 还有个ag 命令 
    
    #了解命令行的 128K 限制。使用通配符匹配大量文件名时,常会遇到“Argument list too long”的错误信息,可以利用 xargs 解决
    ls dir1 | xargs -t -I {} mv {} dir2/{}
    这里的一对大括号是原文给的例子里用的,后来看了参数的用法,其实那对大括号是可以用任意字符串替换的,比如:
    
    ls dir1 | xargs -t -I asdf mv asdf dir2/asdf
    
    
    #sudo 或者 su - 的问题
    
    #交互式管道 percol 或者 fzf
    
    #  man ascii 查看具有十六进制和十进制值的ASCII表。man unicode,man utf-8,以及 man latin1
    octal(八进制), decimal(十进制), and hexadecimal(十六进制)
    
    #screen 或 tmux  dtach
    https://www.cnblogs.com/ywl925/p/3604530.html
    https://www.cnblogs.com/clsn/p/7744858.html
    # screen -S test 新建一个名叫docker-d的session,并马上进入
    # screen -dmS test新建一个名叫docker-d的session,但暂不进入,可用于系统启动脚本里
    # screen -ls 列出当前所有session
    # screen -r test 恢复到zhouxiao这个session,前提是已经是断开状态(-d可以远程断开会话)
    # screen -x test 连接到离线模式的会话(多窗口同步演示)
    # screen ./rsync.sh screen创建一个执行脚本的单窗口会话,可以attach进程ID
    # screen -wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业
      后台进程有关 Ctrl+z/bg/nohup/setsid/&
    
    # nohup ./rsync.sh &
    # setsid ./rsync.sh &
    或
    # (./rsync.sh &) ////在一个subshell中执行
    # ps -ef|grep rsync
    
    #ssl 代理 实现类似 ssr ss 功能
    正向代理(-L):相当于 iptable 的 port forwarding
    反向代理(-R):相当于 frp 或者 ngrok
    socks5 代理(-D):相当于 ss/ssr
    示例: https://zhuanlan.zhihu.com/p/57630633 
    
    HostB 上启动一个 PortB 端口,映射到 HostC:PortC 上,在 HostB 上运行:
    HostB$ ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC
    ( sshd_config StrictHostKeyChecking=no ,ForwardAgent=yes )
    
    # 重定向标准输出和标准错误 (并且从左到右依次执行重定向的命令)
    some-command >logfile 2>&1 或者 some-command &>logfile 
     详解  /dev/null 2>&1 VS 2>&1 >/dev/null 
    https://www.cnblogs.com/kexianting/p/11630085.html 
    >/dev/null 2>&1
    通过使用 <(some command) 可以将输出视为文件
    
    #标准输入输出
    https://zhuanlan.zhihu.com/p/51199964 
    https://blog.csdn.net/cristik/article/details/82785847
     https://www.cnblogs.com/feiquan/p/11379291.html 
    
    标准输入(stdin) 代码为 0 ,实际映射关系:/dev/stdin -> /proc/self/fd/0 
    标准输出(stdout)代码为 1 , 实际映射关系:/dev/stdout -> /proc/self/fd/1
    标准错误输出(stderr)代码为 2 ,实际映射关系: /dev/stderr ->/pro/self/fd/2
    描述符的重定向还有下面的几种用法:
    
    > 默认为标准输出重定向,与 1> 相同
    2>&1 意思是把 标准错误输出 重定向到 标准输出.
    &>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中
    
    你可以将stderr单独定向到一个文件,将stdout重定向到另一个文件:
    
    cmd 2>stderr.txt 1>stdout.txt
    也可以利用下面的方法,将stderr转换成stdout,使得stderr和stdout都被重新定向到同一个文件中:
    
    cmd> output.txt 2>&1
    或者采用这个方法(这个经常用到,我个人比较喜欢用这个,少写几个字符
    cmd &> output.txt
    cmd >& output.txt  # 两个表达式效果一样哒~ 
    &> 等于  2>&1         # https://www.linuxidc.com/Linux/2019-03/157335.htm 
    linux重定向中&>和>&是一个意思,是“复制一个文件描述符”的意思。&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中
    #  &1 代表逻辑上的标准输出 ,不加&就会输出一个1的文件
    这是合并标准输出和标准错误的老派做法:2>&1 ,新派做法为>&
    文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符
    
    #后台
    不过,作业在后台运行一样会将结果输出到屏幕上,如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
    command  >  out.file  2>&1  &
    
    #nohup
    
    使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。nohup命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。该命令的一般形式为:
    
    
    #  Bash 中的“here documents”,例如 cat <<EOF ...  
        bash把操作符<<看成输入指令 https://www.cnblogs.com/tid-think/p/10962124.htm 
    
    #<(some command) 可以将输出视为文件
    
    #${name:?error message} 用于检查变量是否存在。
    
    #使用括号扩展({...})来减少输入相似文本,并自动化文本组合。
    mv foo.{txt,pdf} some-dir
    cp 
    mkdir {}
    
    #bash () 子shell 
    (cd /some/other/dir && other-command)
    
    #块设备df,mount,fdisk,mkfs,lsblk
    ls -i 和 df -i
    
    #grep/egrep 
    它们的参数中 -i,-o,-v,-A 显示匹配后的两行,-B (和A相似)和 -C 
    -A是显示匹配后和它后面的n行。
    -B是显示匹配行和它前面的n行。
    -C是匹配行和它前后各n行。
    
    https://www.oschina.net/translate/most-useful-linux-command-line-tricks 技巧
    #less 命令进入后 可以按F ,功能像tail -f 
       https://www.imooc.com/article/26971?block_id=tuijian_wz 
    #dig 查询DNS的一些记录 A CNAME
      dig -x 反向查询是谁家的dns 
    
    #find -print0和xargs -0原理及用法    
    https://www.cnblogs.com/liuyihua1992/p/9689314.html
    find -print0表示在find的每一个结果之后加一个NULL字符 而不是默认加一个换行符。
    find的默认在每一个结果后加一个'\n',所以输出结果是一行一行的。当使用了-print0之后,就变成一行了
    #xargs -0表示xargs用NULL来作为分隔符
    -n 2 : 参数的个数
    xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。
    xargs -L 
    xargs 可以读入 stdin 的资料 文本意义上的空格、制表符、反斜线、引号 
    $ echo 'one two three' | xargs -p touch
    touch one two three ?...
    使用-L参数,指定每行作为一个命令行参数,就不会报错。
    
    
    $ xargs -L 1 find -name
    "*.txt"
    ./foo.txt
    ./hello.txt
    "*.md"
    ./README.md
    上面命令指定了每一行(-L 1)作为命令行参数,分别运行一次命令(find -name)。
    
    
    #标准输入 scanf函数接受用户输入内容,即从终端设备输入内容 https://blog.csdn.net/xmzzy2012/article/details/80584910
    http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 
    
    
    
    # locate(locate) 
    用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db 
    [root@cent6 ~]# touch new.txt
    [root@cent6 ~]# locate new.txt
    [root@cent6 ~]# updatedb
    [root@cent6 ~]# locate new.txt
    /root/new.txt
    
    
    #set  
    set -o vi
    set -o emacs
    export EDITOR=vim
    set -o pipefail
    ls ./a.txt |echo "hi" >/dev/null
    echo $?
    #用法
    set -euo pipefail
    trap "echo 'error: Script failed: see failed command above'" ERR
     
    
    注释掉set -o pipefail 这一行,再次运行,输出:
    ls: ./a.txt: No such file or directory
    0  # 没有set -o pipefail,默认返回最后一个管道命令的返回值
    
    
    
    
    #cat 
    cat << test10.txt > eof #两种写法
    
    cat << eof > test10.txt  #重点在第二个符号上 > 覆盖 >> 追加
    hello
    ll
    ww
    eof
    
    
    
    
    stdin stdout 原理https://blog.csdn.net/xmzzy2012/article/details/80584910
    
    ipconifg && ip    https://www.cnblogs.com/ginvip/p/6367803.html
    
    
    watch -d df -h
    time
    mount | column -t -s:
    
    
    #免密登录
     https://www.cnblogs.com/shoufeng/p/11022258.html 
    
    

    相关文章

      网友评论

          本文标题:命令行的艺术

          本文链接:https://www.haomeiwen.com/subject/rksvuhtx.html