shell脚本之sort,uniq,tr,cut,sphit,paste,ecal与正则表达式

2024-05-16 02:20

本文主要是介绍shell脚本之sort,uniq,tr,cut,sphit,paste,ecal与正则表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

sort命令

uniq命令

tr命令

cut命令

sphit命令

paste命令

ecal命令

正则表达式

sort命令

sort命令---以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序
比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

语法格式:
sort [选项] 参数

先是对首字母进行排序,如果首字母相同则对第二个字母进行计较,以此类推。

加上-n的选项,实现数值大小的排序

加上-r的选项实现反向排序,可以和-n一起使用

加上-u的选项实现去重,重复出现的数值不再出现。

使用sort -t指定分隔符,-k指定字段为3 -n按照数值排序 指定文件,实现用户的uid号排序

cat file | sort 选项

常用选项:
-n:按照数字进行排序
-r:反向排序
-u:等同于uniq,表示相同的数据仅显示一行
-t:指定字段分隔符,默认使用[Tab]键分隔
-k:指定排序字段
-o <输出文件>:将排序后的结果转存至指定文件
-f:忽略大小写,会将小写字母都转换为大写字母来进行比较
-b:忽略每行前面的空格

sort -n testfile2

sort -t ':' -k 3 -n /etc/passwd

du -a | sort -nr -o du.txt

uniq命令

uniq命令---用于报告或者忽略文件中连续的重复行,常与 sort 命令结合使用

语法格式:
uniq [选项] 参数
cat file | uniq 选项

先使用sort进行排序,接管道符号uniq进行去重

对重复出现的数字进行统计

加上-d和-u分别输出连续重复的行内容和不连续的行内容。

常用选项:
-c:进行计数,并删除文件中重复出现的行
-d:仅显示连续的重复行
-u:仅显示出现一次的行

uniq testfile3

sort -n testfile3 | uniq -c

tr 命令

tr命令---常用来对来自标准输入的字符进行替换、压缩和删除

语法格式:
tr [选项] [参数]

常用选项:
-c:保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换
-d:删除所有属于字符集1的字符
-s:将重复出现的字符串压缩为一个字符;用字符集2 替换 字符集1
-t:字符集2 替换 字符集1,不加选项同结果。    

echo "abcefg" | tr 'a-z' 'A-Z'

实现英文字母大小写的互换

设置第一个字符a-d,后面的字符为0,则输出的结果就会除了a-d后面的字符包括换行符都回变成0

当我们加上反斜杠,换行符也就不会被替代掉了。

参数:
字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
字符集2:指定要转换成的目标字符集。

echo -e "abc\ncabcdab" | tr -c "ab\n" "0"


echo -e "abc\ncabcdab" | tr -c "ab" "0"

echo 'hello world' | tr -d 'od'

删除指定的内容

echo "thissss is a test linnnnnnne." | tr -s 'sn'

删除空行 
echo -e "aa\n\n\n\n\nbb" | tr -s "\n"
cat testfile5 | tr -s "\n"

把路径变量中的冒号":",替换成换行符"\n"
echo $PATH | tr -s ":" "\n"
echo -e "aa\n\n\n\n\nbb" | tr -s "\n" ":"

删除Windows文件“造成”的'^M'字符:
cat abc.txt | tr -s "\r" "\n" > new_file

cat abc.txt | tr -d "\r" > new_file
Linux中遇到换行符("\n")会进行回车+换行的操作,回车符反而只会作为控制字符("^M")显示,不发生回车的操作。而windows中要回车符+换行符("\r\n")才会回车+换行,缺少一个控制符或者顺序不对都不能正确的另起一行。
cat -A abc.txt

cat -v abc.txt


dos2unix abc.txt


数组排序


echo ${array[*]} | tr ' ' '\n' | sort -n > file

a=0
for i in $(cat file)
do
array[$a]=$i
let a++
#array+=($i)
done

cut 命令

cut命令---显示行中的指定部分,删除文件中指定字段
语法格式:
cut  参数
cat file | cut 选项

常用选项:
-f :通过指定哪一个字段进行提取。cut命令使用“TAB”作为默认的字段分隔符。
-d :“TAB”是默认的分隔符,使用此选项可以更改为其他的分隔符。
--complement :此选项用于排除所指定的字段。


--output-delimiter :更改输出内容的分隔符。

cut -d ':' -f 1 /etc/passwd
grep '/bin/bash' /etc/passwd | cut -d ':' -f 1-4,6,7            #以-分隔的开始字段和结束字段指定字段的范围


grep '/bin/bash' /etc/passwd | cut -d ':' --complement -f 2        #排除第二个字段
cut -d ':' -f1,7 --output-delimiter=' ' /etc/passwd                #输出分隔符使用空格分隔

i=123456789
echo $i | cut -b 1-3        #起始位置从1开始
123

echo ${i:0:3}                #起始位置从0开始
expr substr $i 1 3            #起始位置从1开始

split 命令

split命令---linux下将一个大的文件拆分成若干小文件
语法格式:
split 选项 参数 原始文件 拆分后文件名前缀

常用选项:
–l :以行数拆分
–b :以大小拆分

split -l 50 /etc/passwd passwd        

#以50行对文件进行拆分,最后一个文件的行数没有50行以实际行数进行分配
 

如何将一个10G文件分割为10个1G的文件        split -b 1G -d 原文件  目标文件名前缀
如何将一个100行文件分割为10个10行的文件    split -l 10 -d 原文件  目标文件名前缀

paste命令

paste命令---用于合并文件的列

paste [-s][-d <间隔字符>] 文件...

常用选项:
-d<间隔字符> :用指定的间隔字符取代制表符
-s :把多行内容合并为一行进行显示

文件替换。

eval命令

命令字前加上eval时,shell会在执行命令之前扫描它两次。eval命令将首先会先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。
示例1:
echo "hello world" > file
myfile="cat file"
echo $myfile
eval $myfile

示例2:
vim test.sh
#!/bin/bash
eval echo \$$#

./test.sh 1 2 3 4

得4

示例3:
a=100
b=a
eval echo \$$b

100
eval $b=50
echo $a

50

正则表达式

正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式

正则表达式是由普通字符与元字符组成
普通字符包括大小写字母、数字、标点符号及一些其他符号
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符或表达式)在目标对象中的出现模式


基础正则表达式常见元字符:(支持的工具:grep、egrep、sed、awk)
\ :转义字符,用于取消特殊符号的含义,例:\!、\n、\$等
^ :匹配字符串开始的位置,例:^a、^the、^#、^[a-z] 
$ :匹配字符串结束的位置,例:word$、^$匹配空行
. :匹配除\n之外的任意的一个字符,例:go.d、g..d
* :匹配前面子表达式0次或者多次,例:goo*d、go.*d
[list] :匹配list列表中的一个字符,例:go[ola]d,[abc]、[a-z]、[a-z0-9]、[0-9]匹配任意一位数字
[^list] :匹配任意非list列表中的一个字符,例:[^0-9]、[^A-Z0-9]、[^a-z]匹配任意一位非小写字母
\{n\} :匹配前面的子表达式n次,例:go\{2\}d、'[0-9]\{2\}'匹配两位数字
\{n,\} :匹配前面的子表达式不少于n次,例:go\{2,\}d、'[0-9]\{2,\}'匹配两位及两位以上数字
\{n,m\} :匹配前面的子表达式n到m次,例:go\{2,3\}d、'[0-9]\{2,3\}'匹配两位到三位数字
注:egrep、awk使用{n}、{n,}、{n,m}匹配时“{}”前不用加“\”
\w :匹配包括下划线的任何单词字符。\W :匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\d :匹配一个数字字符。\D :匹配一个非数字字符。等价于 [^0-9]。        grep -P
\s :空白符。\S :非空白符

扩展正则表达式元字符:(支持的工具:egrep、awk)grep -E   sed -r
+ :匹配前面子表达式1次以上,例:go+d,将匹配至少一个o,如god、good、goood等
? :匹配前面子表达式0次或者1次,例:go?d,将匹配gd或god
() :将括号中的字符串作为一个整体,例:g(oo)+d,将匹配oo整体1次以上,如good、gooood等
| :以或的方式匹配字符串,例:g(oo|la)d,将匹配good或者glad


正则表达式匹配E-mail地址
用户名@ :^([a-zA-Z0-9_\-\.\+]+)@
子域名 :([a-zA-Z0-9_\-\.]+)
.顶级域名(字符串长度一般在2到5) :\.([a-zA-Z]{2,5})$

egrep '^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$' email.txt
awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}' email.txt

这篇关于shell脚本之sort,uniq,tr,cut,sphit,paste,ecal与正则表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993604

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

[英语单词] paste

这个单词的意思,有时候可能会被,被copy/paste误导了,会有一种假象,只有copy了才可以paste。 其实还可以将两个东西paste在一起。比如下面的: /kernel/include/linux/compiler_types.h /* Indirect macros required for expanded argument pasting, eg. __LINE__. */#d

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

centos6一键安装vsftpd脚本

centos6一键安装vsftpd脚本 手动安装vsftpd参考教程:Centos下安装Vsftpd的图文教程 vsftpd脚本功能: 1.安装 (命令执行:sh xxx.sh)2.添加ftp用户 (命令执行:sh xxx.sh add)3.卸载vsftpd (命令执行:sh xxx.sh uninstall) 测试环境:centos6 x64 centos6 x86(测试centos7以

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

CentOs7上Mysql快速迁移脚本

因公司业务需要,对原来在/usr/local/mysql/data目录下的数据迁移到/data/local/mysql/mysqlData。 原因是系统盘太小,只有20G,几下就快满了。 参考过几篇文章,基于大神们的思路,我封装成了.sh脚本。 步骤如下: 1) 先修改好/etc/my.cnf,        ##[mysqld]       ##datadir=/data/loc

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re