grep 从文件中搜索字符串
python
grep "字符串" 文件
参数:
-n 显示行号
-R 递归及子目录
例如
python
grep "hello" log.c
grep "main" * -nR
find 在指定路径下搜索文件
python
find 路径 -name 文件名
shell
find /home/linux -name hello.c //在/home/linux目录下搜索hello.c
管道连接符 |
说明:管道就是将一个命令的输出当作另一个命令的输入,通过|连接多个命令
(理解:后一个命令的操作,是在前一个命令的基础上进行的)
shell
cat /etc/passwd | grep "linux"
ls /usr/include | grep "stdio.h"
head 显示文件开头的内容
shell
head -行数 文件
head -10 /etc/passwd 显示/etc/passwd文件开头前10行
tail 显示文件尾部指定的行数
shell
tail -行数 文件
tail -1 /etc/passwd 显示/etc/passwd文件最后一行的信息
cut 字符串裁剪函数
shell
cut -d "分割字符" -f 字段
参数:
-d 指定我们的分割字符
-f 指定我们显示的区域
tail -1 /etc/passwd | cut -d ":" -f 1,3,4
grep "linux" /etc/passwd | cut -d ":" -f 1,3
wc:统计某个文件的行数/单词个数/字节数
shell
-l 显示一个文件的行数
-w 显示一个文件的单词个数
-c 显示一个文件的字节数
shell
wc -l log.txt
wc -w log.txt
wc -c log.txt
shell中的通配符
通配符 | 含义 | 实例 |
---|---|---|
* | 匹配任意长度的字符串 | ls file_*.txt |
? | 匹配一个长度的字符串 | ls file_?.txt |
[...] | 匹配其中指定的一个字符 | ls file_[otr].txt |
[-] | 匹配指定的一个字符范围 | ls file_[a-z}.txt |
[^...] | 除了其中指定的字符,其他均可匹配 | ls file_[^obt].txt |
输入/输出重定向
输入/输出重定向是改变 shell 命令或程序默认的标准输入/输出目标,重新定向到新的目标。
Linux 中默认的标准输入定义为键盘,标准输出定义为终端窗口
用户可以为当前操作改变输入或输出,迫使某个特定命令的输入或输出来源作为外部文件。
输出重定向(>)
含义:把本来应该输出到屏幕上的正确的数据,修改输出到其他的地方(文件)
shell
echo "hello world" > log [把hello world写入log.txt文件中,写入前会把log.txt文件内容清除
echo "123" >>log [追加方式]
输入重定向(<)
含义:改变默认的输入源,把本来应该从键盘输入的信息该从其他位置获取。(例如从文件中)
shell
cat /etc/passwd
cat </etc/passwd
错误重定向(2>)
含义:把本来应该输出到屏幕上错误的信息改输出到文件中
shell
das123 2> log.txt
命令置换
含义:将一个命令的输出当作另一个命令的参数,我们叫做命令置换
shell
command1 `command2` command2的输出当作command1的参数
注:这里不是单引号,而是反撒号 esc下面的键为反撒号
shell
find `pwd` -name hello.c
ls `pws`
sed命令详解
采用的是流编辑模式,最明显的特点是,在sed处理数据之前,需要预先提供一组规则,sed会按照此规则来编辑数据
使用场景
- 超大文件处理
- 对文件进行批量增加,替换等
- 有规律的文本,例如 以分号,空格等分隔的日志文件等
说明
sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在-个文本文件中,此命令执行数据的顺序如下:
- 每次仅读取一行内容;
- 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据
- 将执行结果输出。
当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。
格式:
shell
sed [options] '{command}[flags]' [filename]
[]中的数据必须存在 {}内容可省略
options 命令选项
shell
-e 脚本命令 该选项会将其后面的脚本命令添加到已有的命令中
-f 脚本文件 该选项会将其文件中的脚本命令添加到已有的命令中
-n 只显示匹配的行
-i 直接对原文件进行操作,会修改原文件内容。sed命令默认不修改文件
{command}[flags]
sed 内部常用命令
shell
i:insert,在制定或匹配到的行前面添加新行内容为string
a:append,在指定或匹配到的行后面追加新行,内容为string
d: delete,删除符合地址定界条件的的行
p: print,默认 sed 对模式空间内的处理完毕后,将输出的结果输出在标准输出
添加 p 命令,相当于输出了原文,又一次输出了模式匹配处理后的内容。
s: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串,如果修饰符为 g 则为全部替换。
flags
shell
n:1~512之间的数字 表示指定要替换的字符串出现第几次时才进行替换
例如,一行中有 3个 A,但用户只想替换第二个 A,这是就用到这个标记
g:对数据中所有匹配到的内容进行替换,如果没有g,则只会在第一次匹配成功时做替换操作
例如,一行数据中有3个A,则只会替换第一个A;
P:会打印与替换命令中指定的模式匹配的行。此标记通常与-n选项一起使用
场景1 :显示 /etc/passwd 第三行的信息
shell
sed -n '3p' /etc/passwd
3代表行数,p代表输出结果
场景2:在 /etc/passwd 中第一行前添加一行内容为"Good"
shell
sed -e '1iGood' /etc/passwd
1代表第一行,i代表insert插入的意思。表示在第1行前插入新的字符串
场景3: 把/etc/passwd 中使用名字为root的字符串改为 class
格式:
shell
sed 's/旧字符串/新字符串/g' 文件名
功能:替换所有的字符串
sed 's/旧字符串/新字符串/2' 文件名
功能:替换每行中第二次出现该字符串的数据
shell
sed 's/root/class/g' /etc/passwd
场景4:删除 /etc/passwd 中内容并列出行号,并且将第2-5行删除
shell
cat -n /etc/passwd sed '2,5d'
场景5:把 /etc/passwd 文件中root用户的信息带行号的形式重定向到log.txt文件中
要求把log.txt 文件中root替换我linux,并且log.txt中保存替换后的文件
shell
cat /etc/passwd | grep -n "root">log.txt
sed -i 's/root/linux/g' log.txt
awk命令
AWVK 语言的基本功能是在文件或者字符串中基于指定规则浏览和抽取信息。awk 抽取信息后,才能对其他文本操作。它是一个强大的文本分析工具。简单来说 awk 就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。之所以叫 AWK 是因为其取了三位创始人Alfred Aho,Peter Weinberger,和 Brian Kernighan 的 Family Name 的首字符。
sed命令常用于整行的处理。而awk更倾向与包一行分为多个'字段'然后进行处理
awk的适用场景:
- 超大文件处理
- 输出格式化的文本报表
- 执行算数运算
- 执行字符串操作等
语法
shell
awk [options] 'pattern {action}' filename
options: 可选参数
-F 指明输入时用到的字段分隔符,默认分隔符为空格或tab键
-V (var=Value)自定义变量
pattern: 匹配规则
action: 某些计算操作/格式化数据/流控制语句
filename: 文件名
例:
awk -F ":" '{print $1}' /etc/passwd
输出第一列
基础用法:
shell
awk '条件1 {动作1} 条件2 {动作2} ...' 文件名
条件:一般使用关系表达式作为条件
动作(Action):格式化输出、流程控制语句
awk流程控制用法
awk BEGIN关键字
介绍:默认情况下,awk 会从输入中读取一行文本,然后针对该行的数据执行程序脚本,但有时可能需要在处理数据前运行一些脚本命令,这就需要使用 BEGIN 关键字。
格式:
shell
BEGIN{commands}
功能:在执行awk命令前,先执行BEGIN对应的动作
用法:
awk END关键字
和 BEGIN 关键字相对应,END 关键字允许我们指定一些脚本命令,awk 会在读完数据后执行它们
shell
cat /etc/passwd | tail -1 | awk -F ":" 'BEGIN {print "The data3 File Contents:"} {print $2} END {print "End of File"}