linux 常见命令学习

一个程序员连 Linux 命令都不会,还算什么程序员!

这里对常见的 Linux 命令做一个总结。

Linux,全称 GNU/Linux,是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。

一般 linux 系统基本上分两大类:

  • RedHat 系列:Redhat、Centos、Fedora 等;
  • Debian 系列:Debian、Ubuntu 等。

类 Unix 系统目录结构

以上这个目录结构要牢记。

1、Linux 常见命令

1.1 linux 命令格式

command [-options] [parameter]
 命令       选项        参数 

1.2 查看帮助信息

方式一:

command --help

方式二:

man [section] command

man 是 linux 中的用户手册,包含的各个 section 意义如下:

  • 1 – User Commands 一般用户命令
  • 2 - System Calls 系统调用命令, 如 open,write 之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)
  • 3 - C library Functions C 函数库命令, 如 printf,fread
  • 4 - Devices and Special files 是特殊文件, 也就是 /dev 下的各种设备文件 man hd
  • 5 - File formats and conventions 是指文件的格式, 比如 man 5 passwd, 就会得到说明这个文件 /etc/passwd 中各个字段的含义
  • 6 - games for linux 是给游戏留的, 由各个游戏自己定义
  • 7 - Miscellanea 杂项, 例如宏命令包、惯例等。
  • 8 - System administration tools and Deamons 是系统管理用的命令, 这些命令只能由 root 使用, 如 ifconfig
  • 9 - 其他(Linux 特定的), 用来存放内核例行程序的文档。
  • n 新文档, 可能要移到更适合的领域。
  • o 老文档, 可能会在一段期限内保留。
  • l 本地文档, 与本特定系统有关的。

1.3 自动补全

想要编辑某个文件时,若文件名太长,可采用先敲几个前面的字母,按 tab 键可自动补全。

2 次 tab 键可补全显示目录下所有文件

按方向键上可出现上次输入的命令。

1.4 基础命令

  • ls 显示当前目录下的文件

    ls          #显示当前目录下的文件
    ls /        #显示根目录下的文件
    ls /bin     #显示根目录下 bin 文件夹里的文件
    ls -a       #显示当前目录下的所有文件(包括隐藏文件,以. 开头的文件名)
    ls -l        #以详细列表形式显示文件(文件大小显示以字节大小形式)
    ls -l -h    #以详细列表形式显示文件, 同时显示文件大小(以 k,M,G 等单位)
    ls -alh     #(选项可以写在一起)具体每个字符表示什么,后面会 2.6.3 介绍
    
    ls --help  #查看所有用法
  • pwd 显示当前所处位置(在哪个目录下)

  • cd 目录 切换目录

    cd /bin      #切换到根目录下的 bin 文件夹里
    cd ~         #切换到家目录中的用户文件夹
    cd ./test   #切换到当前路径下的 test 文件夹里
    cd ..          #切换到上级目录
    cd -           #快速回到上次你所在的路径
  • touch 文件名 创建文件

  • mkdir 文件夹名 创建文件夹

    mkdir A             #在当前目录下创建 A 文件夹
    mkdir A/B/C -p         #在当前目录下创建 A 文件夹, 再建 B, 再建 C
  • rmdir 文件夹名 删除文件夹,若文件夹不为空,则无法删除

  • rm 文件名 删除文件 / 文件夹

    rm *.txt   #删除所有 txt 文件(空文件)
    rm A -r    #强制删除 A 文件 即使里面有内容
  • cat 文件名 查看文件里的所有内容,可同时显示多个文件内容

    cat > 文件名 新建文件,并在换行后继续输入,将输入内容写进文件中,ctrl + d 结束输入

  • more 文件名 滑动逐次查看内容(按 Enter 键滑动阅览,f 键前翻页,b 键后翻页,q 键结束)

    head 文件名 查看前 10 行

    tail 文件名 查看后 10 行

    tail -f xx.log动态查看(适用于 log 在随时更新的情况)

    tail -50f xx.log动态查看后 50 行

    整齐输出(表格化输出):column -t

    如:tail xx.csv |colunmn -t

  • history 查看已经使用过哪些命令

    !编号    #执行 history 记录的编号对应的哪个命令
  • tree 以目录树的形式显示当前路径下所有文件。这个命令需要安装。

1.5 通配符

linux 里也支持正则表达式进行文件的搜索。

ls 1*.txt    #显示名字以 1 开头的所有 txt 文件
ls 1?3       #显示名字为 1 什么 3 的所有文件
ls 1[1-5]3      #显示名字为 113 或 123 或 133 或 143 或 153 的所有文件

1.6 重定向

ls > xx.txt  #把当前目录下 ls 显示的所有文件名或文件夹名写到 xx.txt 文件里
ls >> xx.txt  #把当前目录下 ls 显示的所有文件名或文件夹名追加写到 xx.txt 文件里
cat 1.txt 2.txt > xxx.txt  #把 1.txt 和 2.txt 内容合并到 xxx.txt 里

1.7 管道

以上的意思是 ls -alh 显示所有文件,将文件放到管道里,再调用 more 命令滑动逐次查看内容。

1.8 链接

分为软链接和硬链接

软链接:就是类似与快捷方式,指向源文件,加 -s

硬链接:相当于给文件又给了个名字,不加 -s

用法 1:链接源文件到目标路径

格式:ln -s 【源目录 / 文件】 【目标路径】

比如,将其他位置的 1.txt 文件,链接到我的目标文件夹的:

ln -s /home/qiang/file/test.txt ./    # 将 1.txt 链接到当前目录下 

修改源目录 / 文件

ln -snf /home/qiang/file/test.py ./  

重命名:

在当前目录下,mv test.py 1.py 即可。

用法 2:创建快捷方式

ln -s 1.txt 1-softlink.txt    #给 1.txt 创建软链接 1-softlink.txt

ln 1.txt 1-hardlink.txt       #给 1.txt 创建硬链接 1-hardlink.txt

当删除文件时,删除的是硬链接,当文件的硬链接为 0 时,就会自动删除文件。

1.9 查找

1.9.1 文本查找

grep 'ntfs' xx.txt     #在 xx.txt 里查找‘ntfs’
grep '^ntfs' xx.txt     #在 xx.txt 里查找开头为‘ntfs’的字符串

grep -v 'ntfs' xx.txt  # -v 作用是取反,不包含‘ntfs’

grep -n 'ntfs' xx.txt  # -n 作用是显示行数

grep -r 'internal_crop_0810.oas' ./   # 以递归的方式查找当前路径及子目录文件里指定的字符串

grep -i 'end process' test.py         # -i 是忽略查找字符的大小写

1.9.2 文件查找

find 路径 形式 内容。find 默认递归指定目录。

形式:

  • -name 按名字
  • -iname 按名字,不区分大小写
  • -size 按大小
find ./temp -name test.sh
find ./temp -name '*.sh'
find ./temp -name '[A-Z]*'

find ./temp -size 2M        #查找大小为 2M 的文件
find ./temp -size -2M        #查找小于 2M 的文件
find ./temp -size +2M        #查找大于 2M 的文件

find ./temp -size +2M -size -4M        #查找大于 2M,小于 4M 的文件

find ./ -not -name 'plot*'  #取反,不包含 

遇到权限问题,一律在最前面加sudo

sudo find / -name *redis* -exec rm -rf {} \;  #查找根目录下所有包含 redis 的文件并删除

1.10 移动与拷贝

mv 1.txt 1_1.txt  #重命名 1.txt 为 1_1.txt

mv 1.txt /laowang  #移动文件 1.txt 到 laowang 文件夹里

cp 1.txt /laowang  #复制文件 1.txt 到 laowang 文件夹里 

若被拒绝,则加 -r 即可解决。

1.11 压缩与解压

tar [参数] 打包文件名 需要打包的文件

tar -cvf test.tar *.py   #将所有 py 文件打包成 test.tar

tar -xvf test   #对 test.tar 进行解包 

注意以上命令只是打包,并没有压缩。

两个核心压缩方式:

tar -zcvf test.tar.gz *.py   #将所有 py 文件压缩成 test.tar.gz, 压缩比很可观
tar -jcvf test.tar.bz2 *.py   #将所有 py 文件压缩成 test.tar.gz, 压缩比上面小

tar -zxvf test.tar.gz        #解包
tar -jxvf test.tar.bz2       #解包

tar -zxvf test.tar.gz -C laowang/ #解压到指定路径 

其他:

zip zzz.zip *.py
unzip -d laowang/ zzz.zip 

1.12 which/who

which ls    #输出 ls 命令的路径
#输出如下:
/bin/ls

who      #显示当前的用户登陆信息
whoami   #显示当前的账户名(用户名)

1.13 编辑器 vim

使用 vi 或者 vim 命令即可编辑

vi text.py   #创建 1.py 并打开 vim 编辑器,默认进入命令模式 

命令与模式转换:

由命令模式进入编辑模式时:a 命令在光标后面插入编辑,A 命令在行末编辑,O 命令在光标上一行插入,o 命令在光标下一行编辑……。

退出保存 :末行模式下按wq 键,一个 x 键也可以。也可以shift+zz

命令模式下命令:

  • yy:复制光标所在的行
    • 4yy:复制光标所在的行开始往下的一共 4 行
  • dd:剪切光标所在的行
    • 2dd:剪切光标所在的行开始往下的一共 4 行
    • D:剪切光标所在的位置一直到行末
    • d0:剪切光标所在的位置一直到行首
    • u:撤销
    • ctrl+r:反撤销
    • x:删除光标定位的那个字符
    • X:删除光标前的那个字符
  • p:粘贴
  • 控制光标
    • h 左,j 下,k 上,l 右
    • M 定位屏幕中间,H 定位屏幕最上方,L 定位屏幕最下方
    • ctrl+f 向下翻一页,ctrl+b 向上翻一页;ctrl+d 向下翻半页,ctrl+u 向上翻半页
    • 回到第 20 行:20+G 键;回到整个代码最后一行:G 键;回第一行:gg 键
    • w 向后跳一个单词长度,b 向前跳一个单词长度
    • shift+a:快速到行尾,并进入插入模式
  • v、V:选择多行
    • >>:向右缩进
    • <<:向左缩进
    • .:重复上次命令
  • 替换
    • r:替换当前字符
    • R:替换当前行光标及其后的字符
    • 整体替换:末行模式下输入%s/ 需替换的内容 / 替换后的内容 /g
    • 替换部分:末行模式下输入 1,10s/ 需替换的内容 / 替换后的内容 /g 替换 1-10 行的。
  • 搜索
    • /:进入搜索模式,输入搜索词,之后按 enter
    • n:下一个
    • N:上一个
    • 取消高亮显示:noh
  • 高频率命令(十分有用)
    • [[:跳到光标所在的程序块(函数)的开头;
    • ]]:跳到光标所在的下一个程序块(函数)的开头;
    • gD:跳转到光标所在的局部变量的定义处
    • '':跳转到光标上次停靠的地方, 是两个’,而不是一个”。与上面一个命令配合用
    • >>:增加光标所在行的缩进
    • <<:较少光标所在行的缩进
    • ctrl+p:编辑模式下的代码补全
    • ctrl+z:vim 模式下回到终端(vim 后台挂起),终端下输入 fg 回车,重新回到 vim 界面。
    • 分屏
      • :sp:上下分屏,ctrl+w 切换屏
      • :vs:左右分屏,ctrl+ww 切换屏
      • :new 新建空白分屏,:w ./new.py
      • vim -o file1 file2:以水平分屏的形式打开多个文件,-O 是垂直分屏

2、补充命令

2.1 时间日期相关

cal #显示当前日历
cal -y 2018  #显示 2018 年日历
date                    #显示当前时间
data "+%Y-%m-%d"         #显示年,月,日

data > xx.txt        #把显示的日期写到 xx.txt 文件里

2.2 查看进程

ps [选项]

ps -aux  #查看当前时刻的所有进程消息
ps -uf
top      #查看进程消息, 持续动态存在
htop  
kill [PID]  #以指定 PID 方式终止对应的进程
kill [PID] -9  #强制杀死进程

2.3 关闭重启

reboot  #重启
shutdown -h now  #立刻关机
shutdown -r now  #立刻关机并通知其他用户

2.4 挂载

df        #显示文件系统的磁盘使用情况
du      #显示本目录所占磁盘空间

2.5 查看或配置网卡

ifconfig   #查看网卡 ip 信息
ping 网址 /ip   #测试通信

2.6 用户权限管理

2.6.1 用户创建切换删除

sudo useradd  账户名 -m      #创建一个账户并创建一个 home 目录(-m 的作用)
sudo passwd 账户名            #设置密码
su 账户名                     #切换账户
su - 账户名                  #切换账户的同时切换到它的家目录
exit                        #登出账户
ssh python@ip    #远程登陆 ip 地址的 python 账户
userdel 账户名       #删除账户

userdel -r 账户名    #删除账户并删除该账户的主目录,谨慎操作
sudo -s     #切换到超级管理员

2.6.1 用户组

groupadd 组名   #创建用户组
groupdel 组名   #删除用户组

cat /etc/group  #查看有哪些组
groupmod +2 次 tab 键   #查看有哪些组
  1. 为普通账户添加 sudo 权限

新创建的用户,默认不能 sudo,需要以下设置

sudo usermod -a -G adm 用户名
sudo usermod -a -G sudo 用户名
  1. 切换文件的用户组
chgrp YY 1.py   #切换 1.py 到 YY 用户组
chown xxx 1.py  #切换 1.py 到 xxx 用户

2.6.3 权限

chmod u=rwx 1.py   #修改文件 owner 的权限
chmod +x 1.py      #给 ower 加执行(x)的权限
  • g=r-x 用户组

  • o=--- 其他人

也可以以数字代表 r,w,x。

r:4 w:2 x:1 –> 可以数字加和代表 rwx 三者的组合。

如 u=4,代表的是 r–;如 u=7,代表的是 rwx。依次类推。

chmod 751 1.py等同于chmod u=rwx,g=r-x,o=--x 1.py

  • -R 参数以递归方式对子目录和文件进行修改

2.7 下载源

默认 ubuntu 系统使用 apt 命令下载文件,那么到底是在哪下呢?

查看下载源: cat /etc/apt/sources.list

最好使用国内镜像源。

可以自己用 vi 编辑器设置更改,完了之后记得更新:sudo apt-get update

备份 ubuntu 默认下载源地址:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

下载安装某工具:

sudo apt-get install 软件包名 

卸载删除某工具:

sudo apt-get remove 软件包名

apt 与 apt-get:简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。

通过 apt 命令,用户可以在同一地方集中得到所有必要的工具,apt 的主要目的是提供一种以「让终端用户满意」的方式来处理 Linux 软件包的有效方式。

apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。


详解 wget,apt-get,yum,rpm 区别

(1)wget 是一个下载命令,名字是 World Wide Web 与 get 的结合

如果要下载一个软件,可以直接 wget+ 下载地址,通过 HTTP,HTTPS,FTP 三个最常见的 TCP/IP 协议下载。

(2)rpm 是 redhat 公司的一种软件包管理机制,直接通过 rpm 命令进行安装删除等操作,最大的优点是自己内部自动处理了各种软件包可能的依赖关系。

rpm -ivh xx.rpm   #安装 xx.rpm 包
rpm -e package    #删除包

(3)yum 全称为 Yellow dog Updater, Modified, 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

是 redhat、centos 下的一个软件安装方式,基于 Linux。

yum install package
yum remove package
yum update

(4)apt-get 是 ubuntu 下的一个软件安装方式,它是基于 debain。

3、Linux 文本处理

3.1 Sed 命令

sed 是一种流编辑器,是一种面向行的文本处理工具,配合正则使用更强大。每次从文本读入一行,在“保持空间”和“模式空间”进行修改,然后再读入下一行。

主要用于字符替换、格式化。

命令格式:

sed [options] 'command/script' file(s)

options 选项 含义
-e 该选项会将其后跟的脚本命令添加到已有的命令中。默认 -e
-f 该选项会将其后文件中的脚本命令添加到已有的命令中。
-n 默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
-i 此选项会直接修改源文件。

command/script 命令字符 含义
[address]s/pattern/replacement/rule address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。
[address]d 删除文本中的特定行
[address]a(或 i)\ 新文本内容 a 命令表示在指定行的后面附加一行;i 命令表示在指定行的前面插入一行
[address]c\ 用于替换的新文本 指定行中的所有内容,替换成该选项后面的字符串
[address]y/inchars/outchars/ 处理单个字符,对 inchars 和 outchars 值进行一对一的映射,要求二者长度一致
[address]p 搜索符号条件的行,并输出该行的内容
[address]w filename 将文本 files 中指定行的内容写入文件 filename 中
[address]r filename 将一个独立文件 filename 的数据插入到当前数据流 files 的指定位置
[address]q 使 sed 命令在第一次匹配任务结束后

address 介绍:

格式:[address]脚本命令 或者 address { 多个脚本命令 }

address 例子及含义
2 sed ‘2s/dog/cat/‘ data.txt,替换第 2 行
2,8 sed ‘2,8s/dog/cat/‘ data.txt,替换第 2-8 行
2,$ sed '2,$s/dog/cat/' data.txt 替换第 2- 最后行
/pattern/ 指定文本模式来过滤出命令要作用的行,sed ‘/line1/s/w1/w2/rule’ filename,将 line1 所在行中的 w1 替换为 w2

介绍两个通配符:^行开始符;$行结尾符。

以下做一些常见用法介绍。

3.1.1 替换 s

格式:

sed -i s#old_text#new_text#rule file       #按照 rule 规则,替换 old_text 为 new_text

-i直接修改原文件 file s代表替换 #是分隔符,也可用 / 符号

rule表示替换的规则:

  • 若不写,只匹配替换第一个 old_text
  • 若为g,表示全局替换
  • 若为i,忽略大小写关键字替换
  • 若为m,m 是数字,如果 old_text 的出现次数小于 m,那么替换不生效。
  • 若为p,打印匹配到的字符所在的行,此标记通常与 -n 选项一起使用。

举个例子:sed -i s#./prep#/home/prep#g ./*/*.log 也可这样写:sed -i 's#./prep#/home/prep#g' ./*/*.log

还可以这样用:

sed -i '#line1#s#old_text#new_text#rule' filename      #按照 rule 规则, 将 line1 所在行中的 old_text 替换为 new_text
sed -i '2,6s#old_text#new_text#rule' filename          #按照 rule 规则, 将 2,6 行中的 old_text 替换为 new_text

#举一个使用 p 的例子
sed -n 's#old_text#new_text#p' filename    #将 old_text 替换为 new_text,并输出替换过的该行

注意:替换类似文件路径的字符串会比较麻烦,需要将路径中的正斜线 / 进行转义:\/

批量替换:

sed '{
s/sales/sale/
s/man/woman/
}' data.txt

3.1.2 删除 d

sed -i '2,3d' data.txt    #删除 2-3 行

3.1.3 插入 a/i

sed -i '3a\add new line' data.txt            #第 3 行后面加一行文字:add new line

sed -i '3i\add new line' data.txt            #第 3 行前面加一行文字:add new line

# 加多行
sed -i '3a\
add one line.\
add two line.' data.txt           

3.1.4 替换整行 c

sed -i '3c\
add new line' data.txt            #第三行替换成 add new line

sed -i '/num3/c\
add new line' data.txt            #将 num3 所在的行全部替换为 add new line

3.1.5 打印行 p

sed -n '/num3/p' data.txt         #打印 num3 所在的行

3.1.6 写入 w

sed -i '1,2w test.txt' data.txt    #将 data.txt 的第 1-2 行写入到 test.txt 中

3.1.7 文件插入 r

sed -i '3r test.txt' data.txt    #将 text.txt 全部插入到 data.txt 的第 3 行的后一行

3.1.8 退出 q

sed -i '3q' data.txt        #输出前 3 行并退出

3.1.9 option -f

sed -f sed.sh data.txt     #-f 后接一个 shell 脚本文件,这个脚本定义了 command/script

3.1.10 option -e

# 利用 -e 可以实现多点编辑

sed -e '3,$d' -e 's/bash/blueshell/' data.txt  #删除 3- 最后一行,并且替换 bash 为 blueshell

3.2 awk 命令

awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行处理。数据可以来自标准输(stdin)、一个或多个文件,或其它命令的输出。它在命令行中使用,但更多是作为脚本来使用。awk 有很多内建的功能,比如数组、函数等,这是它和 C 语言的相同之处,灵活性是 awk 最大的优势。

语法格式:

awk [options] 'scripts' var=value filename

options:

  • -F fs:指定分隔符(可以是字符串或正则表达式),默认分隔符为空格或制表符
  • -f file:从脚本文件中读取 awk 命令
  • -v var=value: 赋值变量,将外部变量传递给 awk

‘scripts’:

#'scripts' 基本结构

'BEGIN{ print "start" } pattern{ commands } END{ print "end" }'

一个 awk 脚本通常由 BEGIN 语句 + 模式匹配 + END 语句 三部分组成,这三部分都是 可选项

执行步骤:

  • 第一步执行 BEGIN 语句
  • 第二步从文件或标准输入读取一行,然后再执行 pattern 语句,逐行扫描文件到文件全部被读取
  • 第三步执行 END 语句

举几个简单例子:

  • 1 从标准输入(管道)读取

输出为:

welcome
hello
2022-03-06

不加 print 参数时默认只打印当前的行

  • 2 只用 command 语句
>>> echo|awk '{ a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c; }'

mgg is mingg or mingongge

awk 的 print 语句中 双引号 其实就是个 拼接 作用

  • 3 pattern{commands},从文件读取匹配
#data.txt
line1  xxxx1
line2  yyyy2
line3  zzzz3
--------------------------
>>> awk '/line2/{print $2}' data.txt
yyyy2

下面开始正式介绍 awk 相关例子。

3.2.1 分隔符 -F

awk 默认以空格为分隔符,还可以接受指定的分隔符。

  • -F ' ' :以空格为分隔符,单双引号都可

  • -F# :以 # 为分隔符,也可-F '#',格式没有那么死板。

  • -F,:以 , 为分隔符

  • -F '[,]':以左中括号 [ 空格 逗号 右中括号]多个单字符作为分隔符

  • -F'abc|cde':用 abc 和 cde多个字符串来作为分隔符

  • -v FS='#':设置内部变量,指定输入分隔符#,其中 FS 是输入分隔符的意思

  • -v OFS='#':设置内部变量,指定输出分隔符#,其中 OFS 是输出分隔符的意思

举个简单例子
awk -F '#' '{print $1}' data.txt

$1 代表文本行中的第 1 个数据字段。后面会介绍 3.3.3—Awk 的变量。

3.2.2 文件命令读取 -f

awk 允许将脚本命令存储到文件中,然后再在命令行中引用。

awk -f {awk 脚本 } { 文件名 }

awk -f cal.awk log.txt

一个 awk 脚本文件的例子:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0

    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

awk 即支持 print,也可 printf。差别可自行百度。

3.3.3 变量赋值 -v

  • 接受内部变量
# log.txt
2 this test
3 Are awk
This's a
10 There apple
-------------------------------------------
>>> awk -v a=1 '{print $1,$1+a}' log.txt

2 3
3 4
This's 1
10 11
#上述中 log.txt 文本中的 a 都被赋值了
  • 接受外部变量
>>> val="aaa"
>>> echo|awk -v v1=$val '{print v1}' 
aaa

Awk 的变量

# 内置变量
$0   #当前记录
$1~$n #当前记录的第 N 个字段

FS   #输入字段分隔符(-F 相同作用)默认空格
RS   #输入记录分割符,默认换行符
OFS  #输出字段分隔符,默认空格
ORS  #输出记录分割符,默认换行符 

NF   #该行字段个数,就是列数
NR   #记录数,就是行号,默认从 1 开始

这些都是比较常用的内置变量,其余的自行百度。

3.3.4 匹配规则 pattern

  • 正则表达式作为 pattern

    /A/            #去匹配含有 A 的字符
    
    awk '/hello/ { print $0 }' myfile  #输出含有 hello 的整行
    
  • 比较表达式作为 pattern

    '$NF == "A"          #输出最后一个字段为 A 的
    
    awk '$NF == "A" { print $0 }' myfile        #输出最后一个字段为 A 的整行
  • 常量表达式作为 pattern,或多模式多动作

    awk ' 真 { 执行代码 } 假 { 不执行代码 }' 
    
    awk '1 { print $0 }' myfile                           #为真,执行输出整行
    awk '$NR==1 {print $NF} $NR==3 {print $NF}'  myfile     
  • 空 pattern 是永远匹配为真的

    awk '{ print $0 }' myfile                   #输出所有的整行,
  • 模式范围: begpat, endpat

    这个模式范围, 是由两个 pattern 组成, 每个 pattern 可以是任意的非特殊类型(可以是正则,比较,常量等 pattern).

    awk 'NR==4, /555-3430/ { print $0}' myfile

    执行方式:匹配输出满足以 begpat 开始到以 endpat 结束中间的所有行,第一轮结束后可以开始下一轮(只满足这个起始和终止条件)。

  • 特殊匹配 BEGIN、END

    awk 里的 BEGIN 语句和 END 语句也是一种匹配。

Awk 正则

^         行首定位符
$         行尾定位符
.         匹配任意单个字符
*         匹配 0 个或多个前导字符(包括回车)
+         匹配 1 个或多个前导字符
?         匹配 0 个或 1 个前导字符 
[]        匹配指定字符组内的任意一个字符 /^[ab]
[^]       匹配不在指定字符组内的任意一个字符
()        子表达式
|         或者
\         转义符
~,!~      匹配或不匹配的条件语句
x{m}      x 字符重复 m 次
x{m,}     x 字符至少重复 m 次
X{m,n}    x 字符至少重复 m 次但不起过 n 次(需指定参数 -posix 或 --re-interval)

3.3.5 执行命令{commands}

awk 是一种编程语言,故支持运算,文件操作,输入输出,循环语句,数组,内置函数等操作。

一般高级点的用法我们用不到,这里不做介绍。如有需要,跳转:

shell 编程之 awk 命令详解 - QuincyHu - 博客园 (cnblogs.com)

AWK 概述_w3cschool

4. Linux 下配置环境变量

环境变量:使得命令能够在全局使用。而不必切换到其安装目录。

4.1 环境变量的配置方法

linux 在正常启动时,先会启动一系列配置文件,再显示命令行提示符:

在用户目录下的 ~/.bashrc中配置环境变量:

# vim ~/.bashrc
// 添加以下一行
export PATH=$PATH:/home/uusama/mysql/bin
或者
export PATH=/home/uusama/mysql/bin:$PATH   (二者表达意思一样)

以上的 export PATH=$PATH:/home/uusama/mysql/bin 可以这样理解:

export 是配置环境变量的命令

PATH 是指定命令的搜索路径。类似的 Linux 中还有 9 个环境变量,见 4.2.3。

$PATH 是指 PATH 这个环境变量,$ 符号就是表示 PATH 是个变量,$PATH 代表了 PATH 路径下所有的变量,可能在其他配置文件配置了 PATH=/etc/pangen/bin 等多个路径,$PATH 可将这些一并加载过来。

冒号 : 是分割符的意思,意思是 PATH 环境变量不仅包含了 $PATH 代表的其他路径下的命令,还加上 /home/uusama/mysql/bin,与 win 平台的分号作用类似, 表示并列

如果只是 export PATH=/home/uusama/mysql/bin 那么 PATH 只会指向 /home/uusama/mysql/bin 这个路径,覆盖了其他的指向。

4.2 扩展

4.2.1 export 命令

配置环境变量当然不只是上面一种方法,还可以直接采用命令的形式:

在命令窗口输入:export PATH=/home/uusama/mysql/bin:$PATH

注意事项:

  • 生效时间:立即生效
  • 生效期限:当前终端有效,窗口关闭后无效
  • 生效范围:仅对当前用户有效

而相对于 vim 命令直接编辑~/.bashrc,就会永久生效:

  • 生效时间:使用相同的用户打开新的终端时生效,或者手动 source ~/.bashrc 生效
  • 生效期限:永久有效
  • 生效范围:仅对当前用户有效

4.2.2 查看变量

  • echo $PATH :显示所有 PATH 环境变量的路径

    /home/pangen/bin:/home/pangen/pangen_build_env/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/ibutils/bin:/home/qiangjiang/.local/bin:/home/qiangjiang/bin
  • export 可以查看(显示)Shell 环境变量

    [roc@roclinux ~]$ export
    declare -x CVS_RSH="ssh"
    declare -x G_BROKEN_FILENAMES="1"
    declare -x HISTCONTROL="ignoredups"
    declare -x HISTSIZE="1000"
    declare -x HOME="/home/roc"
    declare -x HOSTNAME="roclinux"
    …………………………
  • env 命令显示所有的环境变量

  • set 命令显示所有本地定义的 Shell 变量

4.2.3 10 个环境变量

常用的环境变量:

PATH 决定了 shell 将到哪些目录中寻找命令或程序

HOME 当前用户主目录

HISTSIZE 历史记录数

LOGNAME 当前用户的登录名

HOSTNAME 指主机的名称

SHELL 当前用户 Shell 类型

LANGUGE  语言相关的环境变量,多语言可以修改此环境变量

MAIL 当前用户的邮件存放目录

PS1 基本提示符,对于 root 用户是 #,对于普通用户是 $

4.2.4 给命令取别名

在配置文件中,如 ~/.bashrc~/.profile中使用 alias 命令可以定义一些命令的别名。

如:

vim ~/.bashrc
// 编辑添加
alias rm='rm -irf'

这样每次使用 rm 命令时,就代表使用了rm -irf

5、Linux 下运行 python

ubuntu 下默认使用 python2.x 版本,这个版本注意不能卸载掉。

输入 python 命令,即可进入 python 编辑模式,同时也可看到其版本信息。

  • 安装 python3.x 版本:
sudo apt install python3.7
  • 改变 python 指向版本

    默认情况下,输入 python 还是会进入 python2.x,输入 python3 才会进入 python3.x。

    可执行以下命令改变,使得 python 命令指向 python3.x。

    ls -l /usr/bin | grep python   #查看目前的 python 版本及其指向(链接)
    
    rm /usr/bin/python    #删除原有 python 链接
    
    sudo ln -s /usr/bin/python3.7 /usr/bin/python  #新建 python 链接 

    至此已经完成了目标。

  • 安装 pip

    sudo apt install python3-pip

    完成后,输入 pip 即可知道是否安装成功。


欢迎各位看官及技术大佬前来交流指导呀,可以邮件至 jqiange@yeah.net