Linux note3

首先,一些学习资源
一个学习Linux的网站
菜鸟Linux
Linux命令

(瞎记)
面试的一些问题
关于sql
去重 开窗 rowid
使用开窗去重:
在Oracle中使用开窗函数去重需要用到ROW_NUMBER()函数,以下是具体步骤:
使用ROW_NUMBER()函数给每一行分配一个序号,如下所示:

SELECT col1, col2, ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2) AS rn
FROM table1

上述语句会根据col1分组,并按照col2进行排序,然后为每一组分配一个序号。
使用上述语句作为子查询,查询序号为1的记录即可,如下所示:

SELECT col1, col2
FROM (
  SELECT col1, col2, ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2) AS rn
  FROM table1
) t
WHERE t.rn = 1

上述语句会根据col1分组,并按照col2进行排序,然后选择每一组中序号为1的记录,即可实现开窗函数去重的效果。
值得注意的是,在使用开窗函数去重时,需要根据具体的业务需求,选择合适的分组列和排序列。
可以在PARTITION BY子句中指定多个字段进行分组。在Oracle中,开窗函数可以使用PARTITION BY子句按照指定的列进行分组,并使用ORDER BY子句对分组后的结果进行排序。下面是一个示例:

SELECT col1, col2, col3, ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col3) as row_num
FROM table1

上述语句将col1和col2作为分组依据,并按照col3进行排序,为每个分组中的行分配一个序号。需要注意的是,PARTITION BY后面可以跟多个字段,使用逗号分隔即可。

关于Linux
文件转移 cp cp-r
打包文件(暂时还没学到,但是先记一下)
在Linux系统中,通常使用tar命令来创建和管理文件归档。tar命令是Linux中用于打包、压缩和归档文件和目录的标准命令。

打包单个文件,这将创建名为file.tar的文件,其中包含位于/path/to/file的文件。
tar -cvf file.tar /path/to/file
打包整个目录,这将创建名为directory.tar的文件,其中包含位于/path/to/directory目录中的所有文件和子目录
tar -cvf directory.tar /path/to/directory
打包多个文件和目录,这将创建名为archive.tar的文件,其中包含文件/file1、文件/file2、目录/directory1和目录/directory2
tar -cvf archive.tar /path/to/file1 /path/to/file2 /path/to/directory1 /path/to/directory2

压缩打包文件,这将创建名为archive.tar.gz的gzip压缩文件,其中包含文件/path/to/file。
tar -czvf archive.tar.gz /path/to/file
解压缩文件,这将解压名为archive.tar.gz的gzip压缩文件
tar -xzvf archive.tar.gz

复习grep以及sed命令
取出行号

[root@iZ8vbgw05auetj737q3v9rZ yx]# grep -n "oracle" zz.txt|sed "s/[:].*//g"
1
10
11
[root@iZ8vbgw05auetj737q3v9rZ yx]# grep -n "oracle" zz.txt|sed "s/:.*//g"
1
10
11
以下这种方式不够严谨,如果内容含有数字那么就失效
[root@iZ8vbgw05auetj737q3v9rZ yx]# grep -n "oracle" zz.txt|sed "s/[^0-9]//g"
1
10
11

awk 文本格式化输出

awk是一个文本处理工具,它可以用来从文本文件中提取数据、处理数据、格式化输出等。

以下是学习内容无关项(题外话):
关于数据的导出导入
MySQL 使用dblink 可以直接连oracle 但是不推荐 一般而言禁止直连
因为会影响到oracle的性能
另外一种方式 将数据从mysql导出再进行导入oracle 一般是在服务器上进行导出导入(肯定不会是在本地)
交换层 数据湖 data lake format
一般银行会在数据操作方面搭建一个数据库 这个数据库只进行增删改操作 不保留任何历史 ,每天导一次,然后将数据导到data lake之中
上游系统只存放最新的数据(也就是银行的前台)

数仓标准不允许字符串前后有空格
首先进行去空操作
后面处理的时候有left join的时候必须也要去除空值
select * 不允许
在这里插入图片描述
以上语句的错误:
1、关键字必须大写
2、表名必须大写
3、不允许select * 需要把想要的字段全部写出,即便是整个表的字段,也必须一个一个写出,并且每个字段要占一行(为了方便写注释)
4、left join使用必须使用去空操作
5、字段名命名格式必须驼峰 比如Employee_Id_Cdamd(大驼峰) employee_Id_Cdamd(小驼峰)
可以使用一些工具完成大小写转换等操作

数据文件应该有哪些规范:
1、分隔符 100,King,24000
2、封闭符 “100”,“King”,“24000” (并不严格要求,而且会少使用一个空格,减少导出错误)
3、日期格式 (数据类型) 比如“20230301”是字符串还是日期
4、单位 (针对银行)约定好关于金额的所有单位
5、大小写的规范

MySQL默认自动提交 不用commit
如果要使用rollback的话要手动开启事务
start transaction
…(这里写代码的话就是还没有提交)
可以rollback
最后commit提交就可以结束事务

回到学习内容awk
打印列

awk '{print $1}' test.txt
cat test.txt  文件内容长这样
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat test.txt
1	cxk	2000
2	wjk	3100
3	AA	2900
awk '{print $1}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print $1}' test.txt
1
2
3
awk '{print $2}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print $2}' test.txt
cxk
wjk
AA
awk '{print $3}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print $3}' test.txt
2000
3100
2900

 awk '{print $1,$3}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print $1,$3}' test.txt
1 2000
2 3100
3 2900
awk '{print "id:,"$1,"bal:",$3}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print "id:,"$1,"bal:",$3}' test.txt
id:,1 bal: 2000
id:,2 bal: 3100
id:,3 bal: 2900

可以运算加减乘除以及取模取余还有幂

awk '{print "id:,"$1,"bal:",$3*2}' 
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print "id:,"$1,"bal:",$3*2}' test.txt
id:,1 bal: 4000
id:,2 bal: 6200
id:,3 bal: 5800

awk '{print "id:,"$1,"bal:",$3/2}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print "id:,"$1,"bal:",$3/2}' test.txt
id:,1 bal: 1000
id:,2 bal: 1550
id:,3 bal: 1450
awk '{print "id:,"$1,"bal:",$3%2}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print "id:,"$1,"bal:",$3%2}' test.txt
id:,1 bal: 0
id:,2 bal: 0
id:,3 bal: 0
awk '{print "id:,"$1,"bal:",$3**2}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print "id:,"$1,"bal:",$3**2}' test.txt
id:,1 bal: 4000000
id:,2 bal: 9610000
id:,3 bal: 8410000
awk '{print "id:,"$1,"bal:",$3**3}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print "id:,"$1,"bal:",$3**3}' test.txt
id:,1 bal: 8000000000
id:,2 bal: 29791000000
id:,3 bal: 24389000000

ROWNUM
select * from hr.employees where ROWNUM =1
找出第一行的数据
但是使用ROWNUM的话不可以直接令 ROWNUM =2/3/4…
必须是select * from hr.employees where ROWNUM <=n
因为ROWNUM必须找到第一行才能找到第二行,找到第二行才能找到第三行,以此类推…

关于ROUNUM的一些补充:

在Oracle中,可以使用ROWNUM关键字来实现找出前几行的数据。ROWNUM是Oracle的一个伪列,它是在数据被检索出来之后,才会分配的一个行号,所以在查询结果中,可以使用ROWNUM来限制返回的行数。

找出前N行数据

SELECT *
FROM table1
WHERE ROWNUM <= N;

以上语句会返回table1表中前N行的数据。需要注意的是,ROWNUM是在数据被检索出来之后才会分配的行号,因此需要先使用WHERE子句将结果集限制在前N行,然后再使用ROWNUM进行排序。

找出前N行数据,并按照指定的列进行排序

SELECT *
FROM (
  SELECT *
  FROM table1
  ORDER BY col1, col2
)
WHERE ROWNUM <= N;

以上语句会将table1表按照col1和col2进行排序,然后返回前N行数据。需要注意的是,ROWNUM是在数据被检索出来之后才会分配的行号,因此需要先使用子查询对结果进行排序,然后再使用ROWNUM进行限制。

找出每个分组中前N行数据

SELECT *
FROM (
  SELECT col1, col2, col3, ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col3) AS rn
  FROM table1
)
WHERE rn <= N;

以上语句会对table1表按照col1进行分组,并按照col3排序,然后为每个分组中的行分配一个序号。最后返回每个分组中前N行数据。需要注意的是,在使用开窗函数时,需要使用子查询先为每个分组中的行分配一个序号,然后再使用ROWNUM限制返回的行数。

SELECT语句的执行顺序
一般来说,SELECT语句的执行顺序可以分为以下几个步骤:

FROM子句:从指定的表中获取数据。
WHERE子句:从FROM子句获取的数据中筛选出符合条件的数据。
GROUP BY子句:根据指定的列对数据进行分组。
HAVING子句:从GROUP BY子句分组后的数据中筛选出符合条件的数据。
SELECT子句:选择需要显示的列和计算的函数。
ORDER BY子句:对显示的数据进行排序。
LIMIT子句:指定返回的数据行数。

打印第一行的数据 记得是两个等号符号“=”,一个等号是赋值
awk ‘NR==1{print “id:,”$1,“bal:”,$3}’ test.txt

awk 'NR==1{print "id:,"$1,"bal:",$3}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk 'NR==1{print "id:,"$1,"bal:",$3}' test.txt
id:,1 bal: 2000

查看第一行以及第三行的数据
awk 'NR==1  || NR==3{print "id:,"$1,"bal:",$3}' test.txt

awk 'NR==1 || NR==3{print "id:,"$1,"bal:",$3}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk 'NR==1 || NR==3{print "id:,"$1,"bal:",$3}' test.txt
id:,1 bal: 2000
id:,3 bal: 2900
也可以使用NR!=2的方式去找第一行以及第三行的数据
awk 'NR!=2{print "id:,"$1,"bal:",$3}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk 'NR!=2{print "id:,"$1,"bal:",$3}' test.txt
id:,1 bal: 2000
id:,3 bal: 2900

取出第一行第一列的数据以及第三行第一列的数据

awk 'NR==1{print $1}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk 'NR==1{print $1}' test.txt
1
awk 'NR==3{print $1}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk 'NR==3{print $1}' test.txt
3

NR表示当前行号,$1表示第一列数据。NR==3表示当行号等于3时执行操作,print $1表示输出第一列数据。

如果要取出其他行或其他列的数据,可以将NR==3和$1分别修改为对应的行号和列号即可。

一些其他小知识的补充:
拉链(Slowly Changing Dimensions,SCD)
拉链(Slowly Changing Dimensions,SCD)是一种用来处理维度数据变化的技术。维度数据是指用来描述事实数据的一组属性,例如产品、时间、地点等。当维度数据发生变化时,为了保持数据的准确性和一致性,需要对数据进行相应的更新。

拉链技术可以用来处理维度数据中的历史变化,将每个维度记录的生命周期记录下来。具体来说,每个维度记录包括一个开始时间和一个结束时间,表示该维度记录的生效时间范围。当维度数据发生变化时,不是直接更新原有的记录,而是创建一个新的记录,并将原有记录的结束时间修改为新记录的开始时间。

拉链技术通常采用两种方式实现,分别是Type 1和Type 2。Type 1方式是直接更新原有记录的值,但不会保留历史记录;Type 2方式是创建新记录,同时保留历史记录。

例如,对于一个描述产品信息的维度表,如果某个产品的价格发生变化,可以使用拉链技术进行处理。具体来说,可以创建一个新的产品记录,表示价格变化后的新状态,并将原有记录的结束时间设置为新记录的开始时间。这样,可以保留产品历史价格的信息,同时不会影响到已有的事实数据。

拉链技术在数据仓库中被广泛应用,可以帮助数据分析人员更好地理解和分析历史数据,从而更好地支持业务决策。

快照(Snapshot)
在数据库中,快照(Snapshot)通常是指数据库的某个时间点或时间段内的数据拷贝或视图。

与传统的数据库表不同,快照是一种动态的数据视图,可以根据实时需求的变化而进行实时更新。数据库快照在数据备份、数据恢复、数据分析和报表生成等方面具有广泛的应用。

快照通常可以通过多种方式创建和访问,例如:

数据库快照:数据库可以通过内置的快照功能创建快照,并通过SQL语句查询快照中的数据。
文件系统快照:文件系统也可以通过创建快照的方式备份文件系统数据。
虚拟化快照:虚拟化技术可以通过创建快照的方式备份虚拟机的状态和数据。
快照的使用可以帮助数据库管理员或应用程序开发人员快速恢复数据,并提供实时的数据访问和分析。但是,快照也可能会对系统性能和可用性造成一定的影响,因此在使用快照时需要仔细评估其成本和效益。

动态视图与静态视图的区别
在数据库中,视图是一种虚拟的表格,它基于SELECT语句的结果集而创建,可以像表格一样查询,但是并不存储实际数据。根据视图的数据更新频率和实时性,视图可以分为静态视图和动态视图。

静态视图是一种基于SELECT语句创建的视图,它的结果集在创建视图时已经确定,不会随着底层表格数据的变化而变化。因此,静态视图的数据是固定的,只有重新创建视图才能得到新的数据。静态视图可以使用CREATE VIEW语句创建,通常用于提供对底层表格的数据保护和访问控制,以及简化复杂查询的复杂度。

动态视图是一种基于SELECT语句创建的视图,它的结果集是根据底层表格的实际数据动态生成的。当查询动态视图时,系统会实时查询底层表格的数据,并将结果集作为动态视图的数据返回。因此,动态视图的数据是动态的,会随着底层表格的数据变化而变化。动态视图可以使用CREATE OR REPLACE VIEW语句创建,通常用于查询需要实时反映底层表格数据的场景,如数据仓库和实时报表。

总的来说,动态视图与静态视图的区别在于其数据更新的方式。静态视图的数据是静态的,而动态视图的数据是动态的,能够实时反映底层表格的数据变化。因此,在使用视图时,应根据实际需求和场景选择合适的视图类型。

回到正文
awk命令找出所有的数据

awk '{print $0}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print $0}' test.txt
1	cxk	2000
2	wjk	3100
3	AA	2900

找出数据的列数

[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print NF}' test.txt
3
3
3
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print NF,$NF}' test.txt
3 2000
3 3100
3 2900

找出倒数第二列 倒数第三列的数据

awk '{print NF,$NF-1}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print NF,$NF-1}' test.txt
3 1999
3 3099
3 2899
awk '{print NF,$(NF-1)}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print NF,$(NF-1)}' test.txt
3 cxk
3 wjk
3 AA
awk '{print NF,$(NF-2)}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print NF,$(NF-2)}' test.txt
3 1
3 2
3 3

awk指定分隔符 -F

awk -F';' '{print $1}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat test_1.txt
1;cxk;1000
2;fcc;1800
3;zs;2900

[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print $1}' test_1.txt
1;cxk;1000
2;fcc;1800
3;zs;2900
awk -F';' '{print $1}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F';' '{print $1}' test_1.txt
1
2
3

用第二列匹配cxk 用~进行匹配 正则表达式(类似于约等于的意思,因为正则一般都是模糊查询)
用正则进行匹配

awk -F';' '$2~/cxk/{print $3}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F';' '$2~/cxk/{print $3}' test_1.txt
1000
awk -F';' '$2~/cxk/{print $0}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F';' '$2~/cxk/{print $0}' test_1.txt
1;cxk;1000

正则表达式取反

awk -F';' '$2!~/cxk/{print $0}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F';' '$2!~/cxk/{print $0}' test_1.txt
2;fcc;1800
3;zs;2900

awk BEGIN用法 可以在查找之前做一些操作,比如输出之类的操作

awk -F';' 'BEGIN{print"蔡徐坤的余额"}$2~/cxk/{print $3}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F';' 'BEGIN{print"蔡徐坤的余额"}$2~/cxk/{print $3}' test_1.txt
蔡徐坤的余额
1000

awk -F 指定分隔符
-FS 输入分隔符
OFS 输出分隔符
RS 文件的换行符
OSR 输出的换行符
END 在操作之后执行 比如做一些计算
BEGIN 在操作之前执行 比如规定分隔符
-v 指定变量 变量名=值
~匹配正则
!~正则取反
if 循环:awk ‘if (条件){执行动作} else if (条件){动作2}… else {动作三}’ 文件

-F 指定分隔符

 awk -F';' '{print $1}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F';' '{print $1}' test_1.txt
1
2
3

改变换行符

指定输出换行符
'BEGIN{ORS="#"}{print $1,$2,$3}' test_1.txt
1;cxk;1000#2;fcc;1800#3;zs;2900

指定输入换行符

[root@iZ8vbgw05auetj737q3v9rZ yx]# cat test_1.txt
1;cxk;1000#2;fcc;1800#3;zs;2900
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk 'BEGIN{RS="#"}{print $1,$2,$3}' test_1.txt
1;cxk;1000  
2;fcc;1800  
3;zs;2900

BEGIN & END

awk -F';' 'BEGIN{OFS="-"}{print $1,$2,$3}END{print NR}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F';' 'BEGIN{OFS="-"}{print $1,$2,$3}END{print NR}' test_1.txt
1-cxk-1000#2
1
awk 'BEGIN{OFS="-";FS=";"}{print $1,$2,$3}END{print "总共有",NR,"个人"}' test_1.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk 'BEGIN{OFS="-";FS=";"}{print $1,$2,$3}END{print "总共有",NR,"个人"}' test_1.txt
1-cxk-1000#2
总共有-1-个人

-v 声明一个变量
声明一个变量A

awk -v A=2 '{print $1,$2,$3*A}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -v A=2 '{print $1,$2,$3*A}' test.txt
1 cxk 4000
2 wjk 6200
3 AA 5800

在这里插入图片描述
为什么会出现这样的结果,因为这里指定了输入的分隔符为;,那么其实只有一列输出,$2没有结果不输出,$3*$2 数字跟字符串计算结果为0,所以得到以上结果

使用awk直接取出IP地址
在这里插入图片描述
awk & if 条件

[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{if($3>3000){print $2"真有钱"}}' test.txt
wjk真有钱
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{if($3>3000){print $2"真有钱"} else{print $2"真穷"}}' test.txt
cxk真穷
wjk真有钱
AA真穷
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{if($3>3000){print $2"真有钱"} else if ($3>2000) {print "混得还行"} else{print $2"真.穷"}' test.txt
cxk真穷
wjk真有钱
混得还行
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{if($3>3000){print $2"真有钱"} else if ($3>2000) {print $2"混得还行"} else{print $2"真穷"}}' test.txt
cxk真穷
wjk真有钱
AA混得还行

awk '{print "hello"}' test.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{print "hello"}' test.txt
hello
hello
hello

取出MySQL的密码

[root@iZ8vbgw05auetj737q3v9rZ yx]# cat dbuser.txt
MYSQL:USER:ROOT:PASSWORD:123456
ORACLE:USER:SYSTEM:PASSWORD:ORACLE
HIVE:USER:ROOT:PASSWORE:HIVEDB
awk -F ':' '$1~/MYSQL/{print $NF}' dbuser.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F ':' '$1~/MYSQL/{print $NF}' dbuser.txt
123456

修改MySQL的密码为root (这里仅仅是输出并没有修改源文件,因为awk就是一个关于输出的命令)

awk -F ':' 'BEGIN{OFS=":"}$1~/MYSQL/{print $1,$2,$3,$4,"ROOT"}' dbuser.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -F ':' 'BEGIN{OFS=":"}$1~/MYSQL/{print $1,$2,$3,$4,"ROOT"}' dbuser.txt
MYSQL:USER:ROOT:PASSWORD:ROOT

对每行数据加上相应的端口号

awk -v OFS=':' -F =':' '{if($1=="MYSQL"){print $0":POTR:3306"} else if($1=="ORACLE"){print $0":PORT:1521"} else {print $0"PORT:10000"}}' dbuser.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -v OFS=':' -F =':' '{if($1=="MYSQL"){print $0":POTR:3306"} else if($1=="ORACLE"){print $0":PORT:1521"} else {print $0"PORT:10000"}}' dbuser.txt
MYSQL:USER:ROOT:PASSWORD:123456PORT:10000
ORACLE:USER:SYSTEM:PASSWORD:ORACLEPORT:10000
HIVE:USER:ROOT:PASSWORE:HIVEDBPORT:10000

不仅仅可以用==进行匹配,还可以使用正则的方式进行匹配

awk -v OFS=':' -F =':' '{if($1~/MYSQL/){print $0":POTR:3306"} else if($1~/ORACLE/){print $0":PORT:1521"} else {print $0"PORT:10000"}}' dbuser.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk -v OFS=':' -F =':' '{if($1~/MYSQL/){print $0":POTR:3306"} else if($1~/ORACLE/){print $0":PORT:1521"} else {print $0"PORT:10000"}}' dbuser.txt
MYSQL:USER:ROOT:PASSWORD:123456:POTR:3306
ORACLE:USER:SYSTEM:PASSWORD:ORACLE:PORT:1521
HIVE:USER:ROOT:PASSWORE:HIVEDBPORT:10000

awk & for 循环
printf 不换行的输出

 awk '{for(i=1;i<=15;i++) {if(i==9) {continue} else {printf $i" "}};{print " "}}' for.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{for(i=1;i<=15;i++) {if(i==9) {continue} else {printf $i" "}};{print " "}}' for.txt
1 2 3 4 5 6 7 8 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 10 11 12 13 14 15 

awk & while 循环

awk '{i=1;while(i<=NF){printf $i" ";i++};{print " "}}' for.txt
[root@iZ8vbgw05auetj737q3v9rZ yx]# awk '{i=1;while(i<=NF){printf $i" ";i++};{print " "}}' for.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  

#!/bin/bash
for i in ` cat for.txt `
do
 echo -n "$i "
if [ $i -eq 15 ];
  then echo " "
fi
done

LINUX三剑客:grep,sed,awk
正则表达式: ^,$,.,*,|,(),+,?,[],{}
^ 匹配以什么开始的字符
$ 匹配以什么结束的字符
. 一个任何字符

  • 前面一个字符出现了0次或无限次{0,}
  • 前面一个字符出现了至少1次或无限次{1,}
    ? 前面一个字符出现了0次或一次{0,1}
    | 或者(多次匹配)
    () 括号内是一个字符
    [] 范围匹配 a-z,A-Z,0-9
    grep 全局正则搜索
    sed 流编辑器
    awk 文本格式化工具

grep ‘“想要查找的内容”’ 文件名
grep -n 不仅输出匹配的行还输出所在的行号
grep -i 忽略大小写
grep -o 只匹配想要查找的字符
grep -c 返回匹配上的行数
grep -q 静默模式 , 要使用$? 接受执行结果 0 有 1 没有
grep -v 取反,只显示不满足匹配条件的行
grep -E 是grep命令支持扩展正则 等于 egrep
grep -An 同时返回匹配行的后n行
grep -Bn 同时返回匹配行的前n行
grep -Cn 同时返回匹配行的前后n行

sed 流编辑器
增删改查
a:append 追加
i:insert 新增
d:delete 删除
s:swap 替换 s/想要替换的/替换成的/g
p:print 输出

sed -n 关闭sed命令的默认输出
sed -i 不做输出直接修改文件里的数据
sed -r 使用拓展正则表达式
修改mysql的用户名
方法一:
A=grep "MYSQL" -A1 db.dat | grep -v “KaTeX parse error: Undefined control sequence: \s at position 64: …sed "s/^USER:.*\̲s̲/USER:ROOT /g" …A/$B/g” db.dat -i

awk 文本格式化输出 数据湖 DATA LAKE FORMAT

awk 参数 ‘筛选{模式}’ 文件
$0 打印所有列
$n 打印第n列
$NF 打印最后一列
NR 行号
FS 文件的分隔符
OFS 输出的分隔符
RS 文件的换行符
ORS 输出的换行符
-v 指定变量 变量名=值
-F 指定分隔符
~ 匹配正则
!~ 正则取反
if 循环: awk ‘if(条件) {执行动作} else if(条件) {动作2} else{动作三}’ 文件
for 循环:
awk ‘{for(初始值;循环条件;递增值) {循环体};第二步操作}’ 文件
while 循环:
awk ‘{初始值;while(循环条件) {循环体;递增值};第二步操作}’ 文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值