一、查看与操作文件目录及文本内容
1.新建文件,目录
新建目录(文件夹):
mkdir 目录名
新建文件:
touch 文件名.格式
2.移动文件,目录
移动目录(文件夹):
mv 文件夹1地址 文件夹2地址
移动文件:
mv 文件地址 文件夹地址
mv 文件夹1/* 文件夹2地址 #把文件夹1下的所有文件移动到文件夹2中。
3.删除文件,目录
删除目录(文件夹):
rm -rf 文件夹地址 #递归删除文件夹中的所有文件和文件夹。
删除文件:
rm -f 文件地址
4.复制文件,目录
复制目录(文件夹):
cp -r 文件夹1地址 文件夹2地址
复制文件:
cp 文件地址 文件夹地址
5.查看文本内容
grep:用于查找文件里符合条件的字符串。语法:
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式] 文件或目录地址
eg:
grep -r “update” /etc/acpi #查找指定目录/etc/acpi 及其子目录下所有包含字符串"update"的文件,并打印出该字符串所在行的内容
参数:
-a 或 --text : 不要忽略二进制的数据。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或--silent : 不显示任何信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --invert-match : 显示不包含匹配文本的所有行。
-V 或 --version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
find: 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。语法:
find path -option [ -print ] [ -exec -ok command ] {} \;
eg:
find . -name "*.c" #将当前目录及其子目录下所有文件后缀为 .c 的文件列出来
参数:
find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。
-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件。
-amin n : 在过去 n 分钟内被读取过
-anewer file : 比文件 file 更晚被读取过的文件
-atime n : 在过去n天内被读取过的文件
-cmin n : 在过去 n 分钟内被修改过
-cnewer file :比文件 file 更新的文件
-ctime n : 在过去n天内被修改过的文件
-empty : 空的文件
-gid n or -group name : gid 是 n 或group 名称是 name
-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
-type c : 文件类型是 c 的文件。
d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结
s: socket
-pid n : process id 是 n 的文件
head: 用于显示文件开头的内容,默认情况下,只显示文件的头10行内容
head file1 显示文件file1的头部10行内容;
head -n <行数> filename 显示文件内容的前n行;
head -c <字节> filename 显示文件内容的前n个字节;
tail: 用于显示文件尾部的内容,默认情况下只显示指定文件的末尾10行;
tail file1 显示文件file1的尾部10行内容;
tail -n <行数> filename 显示文件尾部的n行内容;
tail -c <字节数> filename 显示文件尾部的n个字节内容;
more:以一页一页的形式显示文件内容,按空白键(space)显示下一页内容,按Enter键会显示下一行内容,按 b 键就会往回(back)一页显示。
more file1 查看文件file1的文件内容;
more -num file2 查看文件file2的内容,一次显示num行;
more +num file3 查看文件file3的内容,从第num行开始显示;
cat:显示文件内容,如果文件内容过多,则只会显示最后一屏的内容。
cat file1 用于查看文件名为file1的文件内容;
cat -n file2 查看文件名为file2的文件内容,并从1开始对所有输出的行数(包括空行)进行编号;
cat -b file3 查看文件名为file3的文件内容,并从1开始对所有的非空行进行编号;
6.查看当前所在目录
pwd
7.查看目录下文件
ls
ls -a
8.文件的属性及标志位
Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。
9.变更文件及目录的属性
更改文件夹名:
mv 文件夹名1 文件夹名2
更改文件名和格式:
mv 文件名称1.文件格式1 文件名称2.文件格式2
二、变量与相关操作
1.变量类别及的作用域
本地变量:
varname=value #作用域为整个bash进程可以使用;
局部变量:
local varname=value #作用域为当前代码段;
环境变量:
作用域为当前shell进程及其子进程,不能影响到其父进程;
export varname=value,如果变量已经定义可以只是用变量名 export varname,即
export varname=value
varname=value
export varname
特殊变量:
$? #上一个命令执行状态的返回值:
程序执行可能有两种返回值:
- 程序执行结果
- 程序状态返回吗(0-255)
0 则为执行正确
1-255 则执行出错(1,2,127系统预留);
$#:获取当前shell命令行中参数的总个数
$*:获取当前shell的所有参数 “$1 $2 $3 …,受IFS控制
$@:这个程序的所有参数 “$1″ “$2″ “$3″ “…”,不受IFS控制
$0 获取当前执行的shell脚本的文件名
$n 获取当前执行的shell脚本的第n个参数值,n=1..9
$$ 获取当前shell的进程号(PID)
$! 执行上一个指令的PID
2.变量命名
- 只能含字母、数字和下划线,并且以字母和下划线开头
- 不能使用bash里的关键字(可用help命令查看保留关键字)
- 见名知意
3.删除变量
使用 unset 命令可以删除变量。
unset variable_name
4.只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
myUrl="https://www.google.com"
readonly myUrl
5.数组变量
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
定义数组:
数组名=(值1 值2 ... 值n)
读取数组:
${数组名[下标]}
Eg: valuen=${array_name[n]}
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
获取数组长度:
length=${#array_name[@]}
length=${#array_name[*]}
三、正则表达式及替换
1.变量替换
字符变量:
$变量名
数组变量:
${数组名[下标/@/*]}
2.算术替换
$((1+2*3))
a=1,b=2,c=6
$((a+c*b))
3.模式匹配
检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中提取符合某个条件的子串等。
限定符
‘zo*’ 能匹配 "z" 以及 "zoo"。* 等价于{0,}
'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
"do(es)?" 可以匹配 "do" 、 "does" 、 "doxy" 。? 等价于 {0,1}。
'o{2}' 不能匹配 "Bob" ,但是能匹配 "food"。
{n,m} m 和 n 均为非负整数,其中n <= m。重复前面匹配的字符n-m次,至少n次,最多m次。
/[0-9]{1,2}/ 设置0-99
定位符
^ 和 $ 分别指字符串的开始与结束。
\b 描述单词的前或后边界,\B 表示非单词边界。
4.选择
参考博客:https://blog.csdn.net/a321123b/article/details/117437912
industr(?:y|ies) 等价于 industry|industries。
xxx(?=pattern),捕获以pattern结尾的内容xxx 。如:"Windows(?=95|98|NT|2000)"能匹配"Windows2000",但不能匹配"Windows3.1"。
xxx(?!pattern),捕获不以pattern结尾的内容xxx。如:"Windows(?!95|98|NT|2000)“能匹配"Windows3.1"中的"Windows”,但不能匹配"Windows2000"中的"Windows"。
(?<=pattern)xxx,捕获以pattern开头的内容xxx。如:" (?<=95|98|NT|2000)Windows"能匹配"2000Windows",但不能匹配"3.1Windows"
(?<!pattern)xxx,捕获不以pattern开头的内容xxx。如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。
5.反向引用
例如
源字符串:abcdebbcde
正则表达式:([ab])\1
匹配到:bb
“([a-z])\1{2}”表示连续三个相同的小写字母,
“([a-z])\1+”表示连续的n个相同的小写字母。
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;//统计单词重复数
6.grep正则表达式搜索
grep -[acinv] '搜索内容串' filename
-a 以文本文件方式搜索
-c 计算找到的符合行的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择,即找 没有搜索字符串的行
其中搜索串可以是正则表达式!
grep正则式,支持awk sed
#搜索有the的行,并输出行号
$grep -n 'the' regular_express.txt
#搜索没有the的行,并输出行号
$grep -nv 'the' regular_express.txt
#[]搜索
$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
#搜索oo前没有g的字符串所在的行
$ grep -n '[^g]oo' regular_express.txt
#搜索包含数字的行
grep -n '[0-9]' regular_express.txt
#搜索以小写字母开头的行
grep -n '^[a-z]' regular_express.txt
#搜索开头不是英文字母的行
grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
#搜索末尾是.的行
$ grep -n '\.$' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
#搜索空行
grep -n '^$' regular_express.txt
22:
23:
g??d 可以用 'g..d' 表示
grep -n 'g..d' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
#搜索g开头和结尾的字符串在的行
$ grep -n 'g.*g' regular_express.txt
#搜索包含两个o的字符串的行
grep -n 'o\{2\}' regular_express.txt
#去除 空白行和行首为 #的行
grep -v '^$' regular_express.txt | grep -v '^#'
egrep -v '^$|^#' regular_express.txt
7.引用及特殊符号
四、输入输出与参数传递
1.获取键盘输入
read varname
如:
read num #接收单个输入
#输入一个数字5
echo $num #打印5
read arr #接收数组
#输入一个数组1 2 3 4 5
echo ${arr[*]} #打印1 2 3 4 5
2.脚本运行时参数传入
脚本内获取参数的格式为:
$n #n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
实例
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
3.Print和printf
Print和printf的区别:
1.print是ksh的内置命令,而printf是bash的内置命令
2.print 中不能使用%s ,%d 或%c;
3.print 自动换行,printf 没有自动换行。
Printf
语法:
printf format-string [arguments...]
实例:
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
输出:
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
4.转义字符:
5.从文件读入及写到文件
编辑文件的一般流程:输入vi 或vim编辑文件进入一般模式,按i进入编辑模式,编辑完成后按esc返回一般模式,按shift+:进入命令模式,输入wq回车保存并退出。
6.管道
将前面命令结果输送给后面的命令
比如统计当前目录有多少个文件:
ls | wc -l
上面是表示把前面的输出当作后面的输入,管道还可以带上xargs参数,用于表示把前面的输出当作后面的参数
find . -name "*.c" | xargs grep "apple" -Hnr
xrargs代表find的输出作为grep的参数,否则grep只会在find找出的文件列表名称中找apple的,不会进入文件中找。
五、条件语句及循环
1.If语句
简单if:
if condition
then
command
fi
if-else-if-else:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
如:
if [ $a == $b ]; #注意shell中中括号两端一定要加空格!!!
then echo "a==b";
elif [ $a -gt $b ];
then echo "a>b";
elif [ $a -lt $b ];
then echo "a<b";
else echo "none";
fi
2.While…do和Do….while
while condition
do
command
done
如:
i=1
while (( $i<5 ));
do echo $i;
let i++;
done
3.Case语句
case 值 in
模式1)
command1
;;
模式2)
command2
;;
esac
如:
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
4.For语句
for var in item1 item2 ... itemN
do
command
done
如:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
又比如:
for num in ${arr[*]} #arr为定义的数组
do
echo $num
done
5.Until语句
循环执行一系列命令直至条件为 true 时停止。
until condition
do
command
done
如:
until [ ! $a -lt 10 ];
do
echo $a;
let a++;
done
6.Select语句
select var in item1 item2 ... ; do
break;
done
.... now $var can be used ....
如:
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other";
do
break;
done
echo "You have selected $var"
六、进程操作
1.察看进程信息
htop :个人墙裂推荐使用htop,虽然需要额外安装,但它显示简单直接且美观炫酷,是装13神器,下面放一个效果图,具体怎么看这里就不细说了:
ps:(英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。
语法
ps [options] [--help]
参数:
ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
-A 列出所有的进程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
au(x) 输出格式 :
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
oUSER: 行程拥有者
oPID: pid
o%CPU: 占用的 CPU 使用率
o%MEM: 占用的记忆体使用率
oVSZ: 占用的虚拟记忆体大小
oRSS: 占用的记忆体大小
oTTY: 终端的次要装置号码 (minor device number of tty)
oSTAT: 该行程的状态:
D: 无法中断的休眠状态 (通常 IO 的进程)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
oSTART: 行程开始时间
oTIME: 执行的时间
oCOMMAND:所执行的指令
实例
ps -A #查看所有进程
ps -aux#查看所有进程的详细信息
ps -aux | grep php#查看所有php进程的详细信息
ps -ef //显示所有命令,连带命令行
根据端口号查进程号
方法一:lsof -i:端口号
方法二:netstat -tunlp|grep 端口号
若想再根据进程号查应用名称:
ps -ef| grep 进程号
2.后台运行
nohup : 不挂断的运行,注意并没有后台运行的功能,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行。
& :是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出。
那么,我们可以巧妙的吧他们结合起来用就是
nohup COMMAND &
实例
sh test.sh &
将sh test.sh任务放到后台 ,关闭xshell,对应的任务也跟着停止,标准输出和标准错误信息会丢失(缺少的日志的输出)
nohup sh test.sh
将sh test.sh任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。
nohup sh test.sh &
将sh test.sh任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。
3.杀掉指定进程
1.使用htop查看进程pid
2.kill -9 进程pid
杀掉名称含某个关键字的所有进程
ps -ef|grep 关键字|grep -v grep|cut -c 9-15|xargs kill -9
运行这条命令将会杀掉所有含有指定关键字的进程
下面将这条命令作一下简单说明:
管道符"|"用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。
"ps -ef" 是linux里查看所有进程的命令。这时检索出的进程将作为下一条命令"grep 关键字"的输入。
"grep 关键字" 的输出结果是所有含有该关键字的进程。
"grep -v grep" 是在列出的进程中去除含有关键字"grep"的进程。
"cut -c 9-15" 是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
"xargs kill -9" 中的 xargs 命令是用来把前面命令的输出结果(PID)作为"kill -9"命令的参数,并执行该命令。"kill -9"会强行杀掉指定进程。
kill和kill -9的区别
两个命令在linux中都有杀死进程的效果,执行kill命令,系统会发送一个SIGTERM信号给对应的程序。当程序接收到该signal信号后,有以下几种情况:
(1)程序立刻停止
(2)当程序释放相应资源后再停止
(3)程序可能仍然继续运行
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止,但是如果程序正在等待IO,可能就不会立马做出响应。而kill -9命令则表示无条件的杀死进程,不管这个进程正在执行还是已经结束。
4.进程置于前后台
$ jobs //查看任务,返回任务编号n和进程号
$ bg %n //将编号为n的任务转后台运行
$ fg %n //将编号为n的任务转前台运行
$ ctrl+z //挂起当前任务
$ ctrl+c //结束当前任务
$ test.sh & //在后台运行test.sh,但当用户退出(挂起)的时候,命令自动也跟着退出。
七、实用命令和工具
1.排序工具
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件][-k field1[,field2]]
参数说明:
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-m 将几个排序好的文件进行合并。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-u 意味着是唯一的(unique),输出的结果是去重的。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
+<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
--help 显示帮助。
--version 显示版本信息。
[-k field1[,field2]] 按指定的列进行排序。
实例
在使用 sort 命令以默认的式对文件的行进行排序,使用的命令如下:
sort testfile
sort 命令将以默认的方式将文本文件的第一列以 ASCII 码的次序排列,并将结果输出到标准输出。
使用 cat 命令显示 testfile 文件可知其原有的排序如下:
$ cat testfile # testfile文件原有排序
test 30
Hello 95
Linux 85
使用 sort 命令重排后的结果如下:
$ sort testfile # 重排结果
Hello 95
Linux 85
test 30
使用 -k 参数设置对第二列的值进行重排,结果如下:
$ sort testfile -k 2
test 30
Linux 85
Hello 95
2.转换工具
FFmpeg 是一组库和可执行文件的工具包,用此工具能够实现几乎任何格式文件间的相互转换。FFmpeg 的功能非常丰富,可以通过它设置视频的帧速率,并可以向其中添加字幕、更改纵横比、改变音频、以及更多的控制等。
例如:把 AVI 格式转为 mp4 格式的视频文件
ffmpeg -i video.avi video.mp4
3.uniq工具
uniq工具作用效果为消除相邻的重复行,如果重复行不在相邻位置则不会消除。因此uniq一般与sort工具一起使用,作用效果与sort工具的-u选项类似。
语法
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
参数:
-c或--count 在每列旁边显示该行重复出现的次数。
-d或--repeated 仅显示重复出现的行列。
-f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
-s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
-u或--unique 仅显示出一次的行列。
-w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。
--help 显示帮助。
--version 显示版本信息。
[输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
[输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
实例
文件testfile中的原有内容为:
$ cat testfile #原有内容
test 30
test 30
test 30
Hello 95
Hello 95
Hello 95
Hello 95
Linux 85
Linux 85
使用uniq 命令删除重复的行后,有如下输出结果:
$ uniq testfile #删除重复行后的内容
test 30
Hello 95
Linux 85
检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数。使用如下命令:
uniq -c testfile
结果输出如下:
$ uniq -c testfile #删除重复行后的内容
3 test 30 #前面的数字的意义为该行共出现了3次
4 Hello 95 #前面的数字的意义为该行共出现了4次
2 Linux 85 #前面的数字的意义为该行共出现了2次 当重复的行并不相邻时,uniq 命令是不起作用的,即若文件内容为以下时,uniq 命令不起作用:
$ cat testfile1 # 原有内容
test 30
Hello 95
Linux 85
test 30
Hello 95
Linux 85
test 30
Hello 95
Linux 85
这时我们就可以使用 sort:
$ sort testfile1 | uniq
Hello 95
Linux 85
test 30
统计各行在文件中出现的次数:
$ sort testfile1 | uniq -c
3 Hello 95
3 Linux 85
3 test 30
在文件中找出重复的行:
$ sort testfile1 | uniq -d
Hello 95
Linux 85
test 30
4.上传/下载工具
需要安装lrzsz工具:
yum install -y lrzsz
上传:rz ,弹框后选择文件
下载:sz 文件名
5.Paste工具
Linux paste 命令用于合并文件的列。paste 指令会把每个文件以列对列的方式,一列列地加以合并。
语法
paste [-s][-d <间隔字符>][--help][--version][文件...]
参数:
-d<间隔字符>或--delimiters=<间隔字符> 用指定的间隔字符取代跳格字符。
-s或--serial 串列进行而非平行处理。
--help 在线帮助。
--version 显示帮助信息。
[文件…] 指定操作的文件路径
实例
使用paste指令将文件"file"、“testfile”、"testfile1"进行合并,输入如下命令:
paste file testfile testfile1 #合并指定文件的内容
使用"cat"指令对3个文件内容进行查看,显示如下所示:
$ cat file #file文件的内容
xiongdan 200
lihaihui 233
lymlrl 231
$ cat testfile #testfile文件的内容
liangyuanm ss
$ cat testfile1 #testfile1文件的内容
huanggai 56
zhixi 73
当合并指令"$ paste file testfile testfile1"执行后,程序界面中将显示合并后的文件内容,如下所示:
xiongdan 200
lihaihui 233
lymlrl 231
liangyuanm ss
huanggai 56
zhixi 73
若使用paste指令的参数"-s",则可以将一个文件中的多行数据合并为一行进行显示。例如,将文件"file"中的3行数据合并为一行数据进行显示,输入如下命令
$ paste -s file #合并指定文件的多行数据
上面的命令执行后,显示的数据内容如下所示:
xiongdan 200 lihaihui 233 lymlrl 231
注意:参数"-s"只是将testfile文件的内容调整显示方式,并不会改变原文件的内容格式。
6.Xargs工具
xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:
find /sbin -perm +700 |ls -l #这个命令是错误的
find /sbin -perm +700 |xargs ls -l #这样才是正确的
xargs 一般是和管道一起使用。
命令格式:
somecommand |xargs -item command
实例
xargs 用作替换工具,读取输入数据重新格式化后输出。
定义一个测试文件,内有多行文本数据:
# cat test.txt
a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z
多行变单行输出:
# cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
-n 单行变多行输出:
# cat test.txt | xargs -n3
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
7.算数计算工具expr
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
语法
expr 表达式
表达式说明:
用空格隔开每个项;
用反斜杠 \ 放在 shell 特定的字符前面;
对包含空格和其他特殊字符的字符串要用引号括起来
实例
1、计算字串长度
expr length “this is a test”
14
2、抓取字符串
expr substr “this is a test” 3 5
is is
3、抓取第一个字符数字串出现的位置
expr index "sarasara" a
2
4、整数运算
expr 14 % 9
5
expr 10 + 10
20
expr 1000 + 900
1900
expr 30 / 3 / 2
5
expr 30 \* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
90
expr 30 * 3
expr: Syntax error
八、Awk|Sed
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or --asign var=value
赋值一个用户定义变量。
-f scripfile or --file scriptfile
从脚本文件中读取awk命令。
基本用法
log.txt文本内容如下:
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
$ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
# 或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
3 Are awk
This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
This's 1
10 11
$ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
---------------------------------------------
2 3 2s
3 4 3s
This's 1 This'ss
10 11 10s
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt