gtb-1 CLI

157 阅读6分钟

CLI

概念:CLI( Command-Line User Interface) 命令行界面,区别于GUI(Graphical User Interface) 图形化用户界面,运行在Shell脚本上,windows最常见的bash (git bash) ,mac中是zsh 。

写Shell的两种方式

bashrc

  1. vim ~/.bashrc 进入bashrc
# 编写bashrc的内容
fucntion hi(){
echo hello,world!
}
  1. source ~/.bashrc
  2. CLI中输入hi,正常显示

: ~./bashrc 中编辑的文件:

不需要加入$PATH

也不需要在其中调用函数

不需要使用#!/bin/bash作为前缀

定义脚本.sh

方式一
  1. 通过vim新建并打开文件hi

    #!/bin/bash
    #编写内容
    	#方法1:直接写文件
    echo hello,world!
    
    	#方法2:写函数+调用
    function sayHi(){
    echo hello,world!
    }
    sayhi
    
  2. 把当前路径加入PATH路径

    echo $PATH  //获取path路径现存地址
    pwd  //当前路径
    
    # 方法1:
    export PATH="$PWD:$PATH" //当前路径加入PATH 输入脚本名称即可显示
    # 方法2
     ./hi  //即可显示
    
    /* ./hi
     hello,world! */
    
    # 可能的错误:文件没有可执行权限
    chmod +x hi   //给该文件添加可执行权限
    

    :以上command均只能在文件被加入$PATH的时候才有用

    重新打开bash,之前被加入的PATH的路径不存在,需要重新加入

方式二

适用于#!/usr/bin/env bash

  1. ~/.bashrc中添加 export MSYS=winsymlinks:nativestrict^C
  2. 将当前目录文件 ( topc 链接到HOME/bin当中lnsHOME/bin当中` ln -s PWD/topc $HOME/bin`
  3. ll $HOME/bin即可看到这里的topc文件是有链接标识到原有目录 (相对引用,浅拷贝->绝对引用,深拷贝

tips: 删除链接,rm目录下$HOME/bin对应文件即可

shell来源

  1. shell builtin /shell 自带

  2. 系统提供

  3. 自定义function

  4. 自己提供的可执行脚本或程序

$

$ 可以用来传递参数、变量

传递参数

//sayhi文件

#!/bin/bash   
NAME=$1 ;  //第一个参数为NAME变量
echo hi,i am $NAME.

//input:sayhi lili
//output:hi,i am lili.

解决参数带空格的问题

sayhi yikina wang
//输出:hi,i am yikina
//问题:参数空格后面的文字没有纳入参数
//解决:将代码修改为
NAME=$*;
NAME=$@;

@基本相同 带引号的""会将参数看作一整个entity,类似于字符串;而"*"会将参数看作一整个entity,类似于字符串;而"@"会将其看作单个参数,类似于数组

eg. 如果有需要for in便利的需求尽量使用$@

[What’s the Difference Between and* and @ in Bash? | Baeldung on Linux](www.baeldung.com/linux/dolla… behave the same way when not quoted%3A,arguments%2C “%24*” treats them as a single entity.)

清空变量

引用变量是需要使用 $ 符号来进行引用。可以使用 unset 来清空变量的值。

参数变量

namename 和 {name} 均可以正确的引用变量。name形式常用使用变量拼接字符串时。比如echo{name} 形式常用使用变量拼接字符串时。 比如 echo {name}1。

还有一种情况是是,当使用{} 还有一种情况是是,当使用1,2..2 .. n 作为shell 参数变量的时候。如果n>10, 则需要使用**10而不能使用{10}** 而不能使用 10

date

原始 vs 带修改日期格式

date
//output:Mon Jul  8 18:18:45     2024

date "+%Y-%m-%d %H:%M:%S"
//output:2024-07-08 18:19:10

cut \ grep

  • cut -d' ‘-f1:根据分隔符(delimiter)' '取第几个f(field) ——列

  • grep : 选中有匹配字符的行 grep -v取反(过滤)

    example:

    name.list中对应姓名和昵称,获取到姓名时显示昵称,姓名不存在,name.list不存在等情况也需要考虑

//name.list
red 小红
yellow 小黄
blue 小蓝

grep red name.list
//output: red 小红

cut -d' '-f1 name.list
/*output:
red
yellow
blue
*/

cut -d' '-f2 name.list
/*output:
小红
小黄
小蓝
*/

//获取给定名字的昵称
grep blue name.list | cut -d' ' -f2
  /* |:管道传输前一表达式的结果 */
  //output: 小蓝

sed

格式:

sed 's///'

sed -E 's///'  //可以使用正则表达式的替换

sed 's/需要被替换的部分/替换成什么/'

eg:

删除sudo\nohup开头 sed -E 's/^(sudo|nohup) +//' \

awk

格式:

awk 'BEGIN{}{} END{}'

/*
BEGIN{开头需要执行什么}
{每一行命令需要执行什么}
END{结尾需要执行什么} */

相关知识点

重定向

redirection > >> 012

输出日志分析

  • 保存方式
# > 将结果覆盖式暂存
date > date.log  //一条结果
# >> 将结果追加暂存
date >> date.log  //两条结果
  • 输出错误重定向
# 2> 可以输出错误信息,且输出错误信息后程序会继续往下执行 (ggg是个未定义的命令
ggg 2> error.log  //error.log中出现command do not found
ggg 1> error.log  //直接报错,不会输出到error.log中

sayhi lili 2> error.log //terminal显示执行结果,error.log显示报错信息
sayhi lili > sayhi.log 2>&1  //2和1同时输出到sayhi.log
sayhi lili > sayhi.log 2>error.log //正确输出到sayhi.log。错误输出到error.log


  • 输入< 重定向
//从name.list中取出结果进行cut操作
cut -d ' ' f2 < name.list  
  • 标准输出

    进程运行时一般都会打开STDIN(标准输入),STDOUT(标准输出)和STDERR (标准错误)三个文件描述符。他们的代码分别是 0 ,1 , 2.

    我们所说的重定向也是指的这三种类型文件描述符的重定向。

    例如:

    • 标准输入(stdin): 代码为0, 使用 < 或 << 重定向

    • 标准输出(stdout): 代码为1, 使用 > 或 >> 重定向

    • 标准错误(stderr): 代码为 2, 使用 2> 或 2>> 重定向

    管道

eg. grep xifwang abc.list 2>/dev/null 0->1 or2

  1. 2>/dev/null: 这部分将标准错误输出重定向到 /dev/null,也就是丢弃任何错误信息。
  2. 0->1 or2: 这部分是对输入输出的重定向操作:
    • 0->1 表示将标准输入 (文件描述符 0) 重定向到标准输出 (文件描述符 1)。
    • or2 表示如果标准输出 (1) 失败,则将输出重定向到标准错误输出 (文件描述符 2)。

总的来说,这个命令会在 abc.list 文件中搜索包含 xifwang 的行,并将结果输出到标准输出,同时忽略任何错误信息。

pipe | 结果传输到下一个操作

ps-aW显示程序运行的所有进程 (记忆:ps =>processes

ps -aW | grep System32过滤显示所有含有s32的进程

eg:

  • 记录history执行过的次数

    history | sed -E 's/^ +//' | cut -d' ' -f3 | sort | uniq -c | sort

    1. history: 这个命令会输出用户之前在命令行中执行过的所有命令。
    2. sed -E 's/^ +//': 这个 sed 命令用于去除每个命令前面的空格。-E 表示使用扩展正则表达式,'s/^ +//' 表示将以一个或多个空格开头的字符串替换为空。
    3. cut -d' ' -f3: 这个 cut 命令用于从每行中提取第三个字段。默认情况下,cut 使用空格作为字段分隔符。
    4. sort: 这个命令将提取出的命令行按字典序排序。
    5. uniq -c: 这个命令会统计每个唯一命令的出现次数。-c 选项会在输出中显示每个命令的计数。
    6. sort: 这个最后一个 sort 命令会根据每个命令的出现次数(即第一个字段)对结果进行排序。

    tips:删除历史命令行数据 history -c

  • 列出proc目录下的内容

ls /proc && echo  suss! || echo failed.
  1. ls /proc: 这个命令会列出 /proc 目录下的所有内容。/proc 是一个特殊的虚拟文件系统,包含了关于正在运行的进程的信息。
  2. &&: 这是一个逻辑运算符,表示"and"。如果前一个命令(即 ls /proc)执行成功(返回值为0),则执行后面的命令。
  3. echo suss!: 如果 ls /proc 执行成功,则会输出 "suss!"。
  4. ||: 这是另一个逻辑运算符,表示"or"。如果前一个命令(即 echo suss!)执行失败(返回值不为0),则执行后面的命令。
  5. echo failed.: 如果 echo suss! 执行失败,则会输出 "failed."。
  • 查找record.log中包含AAA,但不包含BBB的记录的总数:
cat -v record.log | grep AAA | grep -v BBB | wc -l

别名

类似于快捷输入法,输入简短的alias即可展现篇幅较长的全部命令,非常省事!

# alias
//显示已有的alias

alias ll='ls -l'
alias ls='ls -F --color=auto --show-control-chars'
alias lsl='ls -lrt'  //显示目录中的文件按照修改时间排序列表
alias node='winpty node.exe'
alias winget='winpty winget.exe'

注:

除去系统自带的alias,如果想要自己添加更多的alias

要添加到~/.bashrc文件中(记得要source一下),每次打开bash都会执行,不然的话每一次添加之后是没有保存的噢!!

同样,也可以设置快捷别名,快速打开路径,参考:8. 用户管理工具 — Linux Tools Quick Tutorial (linuxtools-rst.readthedocs.io)

bash快捷键

比较好记且常用的:

ctrl + A ctrl + E 回到命令行首尾

ctrl + U or K 删除命令行

cd - 回到上一个目录,=cd ../

有用的网站