在编程中如果能够熟悉shell高阶语法,将对我们进阶为高级程序员有很大的帮助,本文将从Shell重定向 管道命令 awk编程 sed等方面展开介绍。
作者:有勇气的牛排
通常情况下,多数unix系统命令从终端接受输入并将产生的结果输出发送回终端。
一个命令通常从一个标准输入的地方读取,这里恰好终端。同样,一个命令通常将其输出写入到标准输出,治理默认也是终端。
重定向命令列表
命令 | 描述 |
---|---|
command > file | 将输出重定向到file |
conmand < file | 将输入重定向到file |
n > file | 将文件描述符为n的文件重定向到file |
n >> file | 将文件描述符为n的文件,以追加的方式重定向到file |
n >& m | 将输出文件 m 和 n 合并 |
n <& m | 将输入文件 m 和 n 合并 |
<< tag | 将开始标记tag和结束标记tag之间的内容作为输入 |
>
:覆盖到文件
>>
:追加到文件末尾
实例:使用who命令,将结果保存在who.txt中
who > who.txt
这条命令可以让执行的命令,不在屏幕上显示结果(类似于禁止输出),其本质为写一个特殊的文件,但是写的文件都会被抛弃。
who /dev/null
|
哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。
https://www.couragesteak.com/article/348
实例1:将ls的标准输出,利用cat命令写到文件中
ls | cat > dirinfo.txt
实例2:查询指定字符
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,君莫停。
与君歌一曲,请君为我侧耳听。
钟鼓馔玉不足贵,但愿长醉不愿醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
cat gushi.txt | grep "请君为我侧耳听"
实例3:生成一个8位随机密码
tr -dc A-Za-z0-9_ </dev/urandom | head -c 8 | xargs
grep(global search regular expression(RE) and print out the line)
语法: grep [选项] "搜索内容" 文件名
-a 不要忽略二进制数据。
-A 数字: 列出符合条件的行,并列出后续的n行
-B 数字: 列出符合条件的行,并列出前面的n行
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c: 统计找到的符合条件的字符串的次数
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 输出行号
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反向查找
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分
--color=auto 搜索出的关键字用颜色显示
test.txt
人生得意须尽欢,莫使金樽空对月。666
天生我材必有用,千金散尽还复来。666777
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,君莫停。
与君歌一曲,请君为我侧耳听。666
实例:查询包含666
,不包括777
的句子
grep "666" test.txt | grep -v "777"
实例:查出/usr/local/nginx/logs
目录中的所有log文件,并且过滤出包含couragesteak
的行。
find /usr/local/nginx/logs -type f -name "*.log" | xargs grep "couragesteak"
语法:cut [选项] 文件名
-f
:列号:提取第几列
-d
:分割符:按照指定分隔符分割列,默认为 “tab” 制表符
-n
:取消分割多字节字符
-c
:字符范围:不依赖分隔符来区分,而是通过字符范围(行首为0)来进行字段提取。“n-”表示从第n个字符到行尾;“n-m”从第n个字符到第m个字符;“一m”表示从第1个字符到第m个字符。
--complemment
:补足被选择的字节、字符或字段
--out-delimiter
:指定输出内容是的字段分割符
students.txt
id name score
1 Charles 100
2 Tom 99
3 Lisa 99
实例:提取第2、3列内容
cut -f 2,3 student.txt
实例:提取每行前2个字符
cut -c -2 student.txt
实例:提取第2到最后一个字符
cut -c 2- student.txt
cat student.txt | cut -d " " -f 1,2
AWK是处理文本文件的语言,是一个强大的文本分析工具。
;
进行分割$
符条件 | 条件类型 | 描述 |
---|---|---|
BEGIN | awk保留字 | BEGIN作为awk的保留字,其在awk读取数据之前执行,且执行一次。 |
END | awk保留字 | END作为awk的保留字,与BEGIN的作用相反,其在程序执行结束后,执行的一次动作。 |
> | 关系运算符 | 大于 |
< | 关系运算符 | 小于 |
>= | 关系运算符 | 大于等于 |
<= | 关系运算符 | 小于等于 |
== | 关系运算符 | 判断是否相等 |
!= | 关系运算符 | 不等于 |
A=B | 关系运算符 | 判断字符串中是否包含B表达式的字串 |
A!=B | 关系运算符 | 判断字符串中是否不包含B表达式的字串 |
/正则/ | 正则表达式 | 正则 |
BEGIN作为awk的保留字,其在awk读取数据之前执行,且执行一次。
实例:
awk 'BEGIN{printf "先执行我这哦\n"} {printf $2"\n"}' student.txt
END作为awk的保留字,与BEGIN的作用相反,其在程序执行结束后,执行的一次动作。
实例:
awk 'END{printf "程序执行完毕,执行这里哈\n"} {printf $2 "\t" $3 "\n"}' student.txt
实例
cat student.txt | grep -v score | awk '$3 > 99 {printf $2 "\t" $3 "\n"}'
实例:打印Chrles的信息
awk '/Charles/ {print}' student.txt
内置变量 | 描述 |
---|---|
$0 | 打印所有数据 |
$n | 当前记录的第n列字段 |
NF | 当前所在行总字段数 |
NR | 当前所在行的行号 |
… | … |
# 打印所有数据
awk '{print $0}' student.txt
# 当前记录的第n列字段
awk '{print $n}' student.txt
# 当前所在行总字段数
awk '{print NF}' student.txt
# 当前所在行的行号
awk '{print NR}' student.txt
# 打印文本文件的总行数
awk 'END{print NR}' student.txt
# 打印文本第一行
awk 'NR==1{print}' student.txt
# 打印文本第二行第一列
sed -n "2, 1p" student.txt | awk '{print $1}'
# 进程查看
ps -aux | grep watchdog
# 进程查看 获取第1、2、3列
ps -aux | grep watchdog | awk '{print $1"\t"$2"\t"$3}'
# 进程查看 第一行 获取第1、2、3列
ps -aux | grep watchdog | awk 'NR==1{print $1"\t"$2"\t"$3}'
# 获取行数
df -h | awk 'END{print NR}'
# 获取最后一行的列数
ps -aux | grep watchdog | awk 'END{print NF}'
# 获取最后一列
ps -aux | grep watchdog | awk 'END{print $NF}'
对于简单的命令可以在命令行中解决,但是面对大量从操作时,写成脚本就非常中重要了。
使用 -f
进行调用
print.awk
{print $1"\t"$2"\t"$3}
ps -aux | grep watchdog | awk -f print.awk
sed命令是利用脚本来处理文本文件,并且可以按照执行编辑文本文件。
参数说明:
-e