本文主要是介绍学习笔记之shell基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Shell学习笔记
一、linux系统与shell环境准备
- linux的组成:
- linux内核:
- linux与Windows的区别:
- linux的文件目录:
-
linux的基本命令:
- ls:列出目录
- cd:切换目录
- pwd:显示目前的目录
- mkdir:创建一个新的目录
- rmdir:删除一个空的目录
- cp:复制文件或目录
- rm:移除文件或目录
- mv:移动文件与目录,或修改文件与目录的名称
-
Shell介绍可以和linux内核进行交互的工具
- 常见的shell:
- Bourne Shell (/usr/bin/sh或/bin/sh)
- Bourne Again Shell (/bin/bash)
- C Shell (/usr/bin/csh)
- K Shell (/usr/bin/ksh)
- Shell for Root (/sbin/sh)
图中第一行#! /bin/bash告诉操作系统使用的是bash Shell,第二行echo "hello"是让Shell输出一个hello。
- 运行shell
- chmod +x ./test.sh # 使脚本具有执行权限
- /bin/sh test.sh
二、Linux三剑客与管道使用
- 管道、正则表达式、grep、sed、awk
-
管道 |
Linux提供管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入
- echo “hello1234” | grep “hello”
- 正则表达式
- 正则表达式就是记录文本规则的代码
- 演练环境:https://tool.oschina.net/regex
- 举例:
- 找出所有的 hi 单词 \bhi\b
- hi 单词后面有Lucy单词 \bhi\b.*\blucy\b
- 以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字 0\d{2}-\d{8}
-
练习:
- 匹配以字母a开头的单词 \ba\w*\b
- 匹配刚好6个字符的单词 \b\w{6}\b
- 匹配1个或更多连续的数字 \d{1,} \d+
- 5位到12位QQ号 ^\d{5,12}
- grep
- 定义:根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
- 命令形式:grep [OPTIONS] PATTERN [FILE…]
- 选项:
- -v 显示不被pattern匹配到的行
- -i 忽略字符大小写
- -n 显示匹配的行号
- -c 统计匹配的行数
- -o 仅显示匹配到的字符串
- -E 使用ERE,相当于egrep
- 实战1:
- 查找文件内容包含root的行
- 查找文件内容不包含root的行
- 实战2:
- sed
- 定义:sed是流编辑器,一次处理一行内容,只在模式空间中操作,不会改变原文件
-
命令解析:
sed [-hn..][-e<script>] [-f<script文件>] [文本文件]
sed [-hnV] [-e<script>] [-f<script文件>] [文本文件]
-e<script>
以选项中指定的script来处理输入的文本文件-f<script>
以选项中指定的script文件来处理输入的文本文件
-
常用动作:
- a:新增 sed -e ‘4 a newline’ 在第4行后面增加一行,内容newline
- c:取代 sed -e ‘2,5c No 2-5 number’ 使用c后面的内容去取代2-5行的内容
- d:删除 sed -e ‘2,5d’ 删除2-5行
- i:插入 sed -e ‘2i newline’ 在第二行前面插入新的一行,内容newline
- p:打印 sed -n ‘/root/p’ 打印带root的内容,p指打印
- s:取代 sed -e ‘s/old/new/g’ 用新的内容new取代旧的old的内容,s代表取代,g代表全局,有多个的匹配时候,可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个
-
实战1:
-
查看帮助
- man sed 使用j 和 k 上下翻页,j向下翻页,k向上翻页
- sed -h
-
在第四行后添加新字符串
- sed -e ‘4 a newline testfile’ test.txt
实战2:
-
在第二行后加上 newline
- sed ‘2a drink tea’ test.txt
-
在第二行前加上newline
- sed ‘2i drink tea’ test.txt
实战3:
-
全局替换
- sed -e ‘s/root/hello/g’ test.txt
-
直接修改文件内容
- sed -i ‘s/root/hello/g’ test.txt
-
awk
- 定义:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理。
-
命令形式:awk ‘pattern + action’ [FILE]
-
awk ‘pattern + action [filenames]’
- -pattern 正则表达式
- -action 对匹配到的内容执行的命令(默认为输出每行内容)
-
常用参数:
- FILENAME:awk浏览的文件名
- BEGIN:处理文本之前要执行的操作
- END:处理文本之后要执行的操作
- FS:设置输入域分隔符,等价于命令行 -F选项
- NF:浏览记录的域的个数(列数)
- NR:已读的记录数(行数)
- OFS:输出域分隔符
- ORS:输出记录分隔符
- RS:控制记录分隔符
- $0:整条记录
- $1:表示当前行的第一个域……依次类推
-
实战1:
-
搜索/etc/passwd有关root关键字的所有行,并显示对应的shell
- awk -F: ‘/root/{print $7}’ /etc/passwd
-
打印/etc/passwd/的第二行信息
- awk -F: ‘NR==2{print $0}’ /etc/passwd
-
实战2:
-
使用begin加入标题
- awk -F: ‘BEGIN {print “BEGIN”,“BEGIN”}{print $1,$2}’ /etc/passwd
-
自定义分隔符
- echo “111 222|333 444|555 666”|awk ‘BEGIN{RS="|"}{print $0}’
-
实战三:取出文件中指定列并写入到一个新文件
-
awk -F “|” ‘BEGIN {print “merc_id,”,“amount,”,“stl_amt,”,“fee,”}{OFS=","}{print $4,$12,$13,$14}’ ./test20210628_000001.txt > test_20210628.csv
-
对当前文件夹下的test20210628_000001.txt文件执行:将文件内容以"|“分割,首行打印表头,数据分隔符为”,",打印第4、12、13、14列,并将内容写入到新文件test_20210628.csv。
这篇关于学习笔记之shell基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!