Мы называем их тремя мушкетерами grep, sed и awk. Их освоение может улучшить эксплуатацию и техническое обслуживание и повысить эффективность работы. Даже если это не эксплуатация и обслуживание, нам очень удобно обрабатывать данные. Для многих операций по обработке данных, Написание программ должно быть С ним также можно справиться, но это гораздо менее эффективно, чем команды, которые уже имеют определенные функции.Нам нужно только оперировать командами. В этой статье я могу объяснить некоторые базовые знания и практичность Трех мушкетеров. Надеюсь, вы сможете сделать это сами. В конце концов, я испытал более глубокое впечатление и продолжу обновлять его позже. . .
grep
Введение
grep — мощный инструмент текстового поиска, поддерживающий регулярные выражения.
Полное имя ( регулярное выражение глобального поиска (RE) и вывод строки)
Синтаксис: grep [опция]... ШАБЛОН [ФАЙЛ]...
Обычно используется:
usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
[-e pattern] [-f file] [--binary-files=value] [--color=when]
[--context[=num]] [--directories=action] [--label] [--line-buffered]
[--null] [pattern] [file ...]
Общие параметры:
-v 取反
-i 忽略大小写
-c 符合条件的行数
-n 输出的同时打印行号
^* 以*开头
*$ 以*结尾
^$ 空行
фактическое использование
Подготовьте текст короткого рассказа:
[root@iz2ze76ybn73dvwmdij06zz ~]# cat monkey
One day,a little monkey is playing by the well.一天,有只小猴子在井边玩儿.
He looks in the well and shouts :它往井里一瞧,高喊道:
“Oh!My god!The moon has fallen into the well!” “噢!我的天!月亮掉到井里头啦!”
An older monkeys runs over,takes a look,and says,一只大猴子跑来一看,说,
“Goodness me!The moon is really in the water!” “糟啦!月亮掉在井里头啦!”
And olderly monkey comes over.老猴子也跑过来.
He is very surprised as well and cries out:他也非常惊奇,喊道:
“The moon is in the well.” “糟了,月亮掉在井里头了!”
A group of monkeys run over to the well .一群猴子跑到井边来,
They look at the moon in the well and shout:他们看到井里的月亮,喊道:
“The moon did fall into the well!Come on!Let’get it out!”
“月亮掉在井里头啦!快来!让我们把它捞起来!”
Then,the oldest monkey hangs on the tree up side down ,with his feet on the branch .
然后,老猴子倒挂在大树上,
And he pulls the next monkey’s feet with his hands.拉住大猴子的脚,
All the other monkeys follow his suit,其他的猴子一个个跟着,
And they join each other one by one down to the moon in the well.
它们一只连着一只直到井里.
Just before they reach the moon,the oldest monkey raises his head and happens to see the moon in the sky,正好他们摸到月亮的时候,老猴子抬头发现月亮挂在天上呢
He yells excitedly “Don’t be so foolish!The moon is still in the sky!”
它兴奋地大叫:“别蠢了!月亮还好好地挂在天上呢!
Прямой поиск совпадающих строк
[root@iz2ze76ybn73dvwmdij06zz ~]# grep moon monkey
“Oh!My god!The moon has fallen into the well!” “噢!我的天!月亮掉到井里头啦!”
“Goodness me!The moon is really in the water!” “糟啦!月亮掉在井里头啦!”
“The moon is in the well.” “糟了,月亮掉在井里头了!”
They look at the moon in the well and shout:他们看到井里的月亮,喊道:
“The moon did fall into the well!Come on!Let’get it out!”
And they join each other one by one down to the moon in the well.
Just before they reach the moon,the oldest monkey raises his head and happens to see the moon in the sky,正好他们摸到月亮的时候,老猴子抬头发现月亮挂在天上呢
He yells excitedly “Don’t be so foolish!The moon is still in the sky!”
Найти обратные совпадающие строки
[root@iz2ze76ybn73dvwmdij06zz ~]# grep -v moon monkey
One day,a little monkey is playing by the well.一天,有只小猴子在井边玩儿.
He looks in the well and shouts :它往井里一瞧,高喊道:
An older monkeys runs over,takes a look,and says,一只大猴子跑来一看,说,
And olderly monkey comes over.老猴子也跑过来.
He is very surprised as well and cries out:他也非常惊奇,喊道:
A group of monkeys run over to the well .一群猴子跑到井边来,
“月亮掉在井里头啦!快来!让我们把它捞起来!”
Then,the oldest monkey hangs on the tree up side down ,with his feet on the branch .
然后,老猴子倒挂在大树上,
And he pulls the next monkey’s feet with his hands.拉住大猴子的脚,
All the other monkeys follow his suit,其他的猴子一个个跟着,
它们一只连着一只直到井里.
它兴奋地大叫:“别蠢了!月亮还好好地挂在天上呢!”
Непосредственно найти количество строк, соответствующих условию
[root@iz2ze76ybn73dvwmdij06zz ~]# grep -c moon monkey
8
Найдите совпадающие строки независимо от регистра
Сначала посмотрите на результаты прямого поиска
[root@iz2ze76ybn73dvwmdij06zz ~]# grep my monkey
Игнорировать просмотр дела
[root@iz2ze76ybn73dvwmdij06zz ~]# grep -i my monkey
“Oh!My god!The moon has fallen into the well!” “噢!我的天!月亮掉到井里头啦!”
Найдите совпадающие строки и номера выходных строк
[root@iz2ze76ybn73dvwmdij06zz ~]# grep -n monkey monkey
1:One day,a little monkey is playing by the well.一天,有只小猴子在井边玩儿.
4:An older monkeys runs over,takes a look,and says,一只大猴子跑来一看,说,
6:And olderly monkey comes over.老猴子也跑过来.
9:A group of monkeys run over to the well .一群猴子跑到井边来,
13:Then,the oldest monkey hangs on the tree up side down ,with his feet on the branch .
15:And he pulls the next monkey’s feet with his hands.拉住大猴子的脚,
16:All the other monkeys follow his suit,其他的猴子一个个跟着,
19:Just before they reach the moon,the oldest monkey raises his head and happens to see the moon in the sky,正好他们摸到月亮的时候,老猴子抬头发现月亮挂在天上呢
Найдите строки, начинающиеся с буквы J
[root@iz2ze76ybn73dvwmdij06zz ~]# grep '^J' monkey
Just before they reach the moon,the oldest monkey raises his head and happens to see the moon in the sky,正好他们摸到月亮的时候,老猴子抬头发现月亮挂在天上呢
Найти это конец линии
[root@iz2ze76ybn73dvwmdij06zz ~]# grep "呢$" monkey
Just before they reach the moon,the oldest monkey raises his head and happens to see the moon in the sky,正好他们摸到月亮的时候,老猴子抬头发现月亮挂在天上呢
Вы можете выполнить команду grep --help, чтобы увидеть больше связанных команд, которые здесь не будут продемонстрированы.
резюме
С сильной сетью многие вещи можно найти в Интернете, но основы должны быть вашими собственными. Если вы опытны, вы не будете паниковать, когда столкнетесь с чем-то.
sed
Sed — это потоковый редактор, отличный инструмент для обработки текста, который можно использовать в сочетании с регулярными выражениями.
процесс выполнения sed
команда sed
Команда: Сэд
Синтаксис: sed [опции]... {набор команд} [входной файл]...
Общие команды:
d 删除选择的行
s 查找
y 替换
i 当前行前面插入一行
a 当前行后面插入一行
p 打印行
q 退出
替换符:
数字 :替换第几处
g : 全局替换
\1: 子串匹配标记,前面搜索可以用元字符集\(..\)
&: 保留搜索刀的字符用来替换其他字符
работать:
заменять
Просмотр файлов:
➜ happy cat word
Twinkle, twinkle, little star
How I wonder what you are
Up above the world so high
Like a diamond in the sky
When the blazing sun is gone
заменять:
➜ happy sed 's/little/big/' word
Twinkle, twinkle, big star
How I wonder what you are
Up above the world so high
Like a diamond in the sky
When the blazing sun is gone
Посмотреть текст:
➜ happy cat word1
Oh if there's one thing to be taught
it's dreams are made to be caught
and friends can never be bought
Doesn't matter how long it's been
I know you'll always jump in
'Cause we don't know how to quit
Глобальная замена:
➜ happy sed 's/to/can/g' word1
Oh if there's one thing can be taught
it's dreams are made can be caught
and friends can never be bought
Doesn't matter how long it's been
I know you'll always jump in
'Cause we don't know how can quit
Заменить по строке (заменить 2 на последнюю строку)
➜ happy sed '2,$s/to/can/' word1
Oh if there's one thing to be taught
it's dreams are made can be caught
and friends can never be bought
Doesn't matter how long it's been
I know you'll always jump in
'Cause we don't know how can quit
Удалить:
Посмотреть текст:
➜ happy cat word
Twinkle, twinkle, little star
How I wonder what you are
Up above the world so high
Like a diamond in the sky
When the blazing sun is gone
Удалить:
➜ happy sed '2d' word
Twinkle, twinkle, little star
Up above the world so high
Like a diamond in the sky
When the blazing sun is gone
Показать номера строк:
➜ happy sed '=;2d' word
1
Twinkle, twinkle, little star
2
3
Up above the world so high
4
Like a diamond in the sky
5
When the blazing sun is gone
Удалить строки со 2 по 4:
➜ happy sed '=;2,4d' word
1
Twinkle, twinkle, little star
2
3
4
5
When the blazing sun is gone
Добавить строку:
Вставить вперед:
➜ happy echo "hello" | sed 'i\kitty'
kitty
hello
Вставить наоборот:
➜ happy echo "kitty" | sed 'i\hello'
hello
kitty
Измените строку:
Замените вторую строку на hello kitty
➜ happy sed '2c\hello kitty' word
Twinkle, twinkle, little star
hello kitty
Up above the world so high
Like a diamond in the sky
When the blazing sun is gone
Замените предпоследнюю строку на hello kitty
➜ happy sed '2,$c\hello kitty' word
Twinkle, twinkle, little star
hello kitty
написать строку
Запишите строку со звездочкой в файл c, c создается заранее
➜ happy sed -n '/star/w c' word
➜ happy cat c
Twinkle, twinkle, little star
покидать
После печати 3 строк выйдите из sed
➜ happy sed '3q' word
Twinkle, twinkle, little star
How I wonder what you are
Up above the world so high
awk
происхождение имени
Инициалы фамилий основателей Альфреда Ахо, Питера Вайнбергера и Брайана Кернигана.
Мощные инструменты обработки текста
По сравнению с sed и grep, awk — это не только небольшой инструмент, но и небольшой язык программирования.Он поддерживает ветвь if и оператор цикла while, а также встроенные функции.Это более эффективный инструмент, чем grep и sed. Мощные инструменты обработки текста, но это означает, что нужно большему учиться.
Давайте поговорим о некоторых основных концепциях и практических операциях awk.
грамматика
обычно используется
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
площадь
Подобно концепции столбцов базы данных, но она указывается в соответствии с порядковым номером.Например, я хочу, чтобы первый столбец был2 и так далее. $0 — вывести содержимое всего текста. По умолчанию в качестве разделителей используются пробелы, конечно, вы можете установить разделители, подходящие для вашей ситуации, через -F.
Я заранее составил раздел данных, таблицы данных о студентах и успеваемости студентов.
Число столбцов | название | описывать |
---|---|---|
1 | Name | Имя |
2 | Math | математика |
3 | Chinese | язык |
4 | English | английский |
5 | History | история |
6 | Sport | физическая культура |
8 | Grade | класс |
«Имя Математика Китайский Английский История Спортивный класс вывести весь текст
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '{print $0}' students_store
Xiaoka 60 80 40 90 77 class-1
Yizhihua 70 66 50 80 90 class-1
kerwin 80 90 60 70 60 class-2
Fengzheng 90 78 62 40 62 class-2
вывести первый столбец (имя столбца)
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '{print $1}' students_store
Xiaoka
Yizhihua
kerwin
Fengzheng
Режим и действие
awk '{[pattern] action}' {filenames}
модель
шаблон возможно
- Условные операторы
- Обычный
Два специальных поля шаблона BEGIN и END (соответствует или печатает количество строк, если оно не указано)
-
BEGIN: обычно используется для печати имен столбцов.
-
END : Обычно используется для печати символа итогового символа.
действие
Действие указывается в {}, которое обычно используется для печати, или это может быть сегмент кода.
Пример
Добавьте заголовок к приведенному выше тексту:
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {print "Name Math Chinese English History Sport grade\n----------------------------------------------"} {print $0}' students_store
Name Math Chinese English History Sport grade
----------------------------------------------------------
Xiaoka 60 80 40 90 77 class-1
Yizhihua 70 66 50 80 90 class-1
kerwin 80 90 60 70 60 class-2
Fengzheng 90 78 62 40 62 class-2
Выведите только имя, оценки по математике, информацию о классе и суффикс (приложите настойчивые усилия):
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {print "Name Math grade\n---------------------"} {print $1 2 "\t" $7} END {print "continue to exert oneself"}' students_store
Name Math grade
---------------------
Xiaoka 60 class-1
Yizhihua 70 class-1
kerwin 80 class-2
Fengzheng 90 class-2
continue to exert oneself
Объедините обычные
Такие вещи, как grep и sed, также поддерживают регулярные выражения. Я не буду вводить здесь регулярные выражения, если вам интересно, я сделаю отдельную статью.
Инструкции:
Символ ~, за которым следует регулярное выражение
В это время к нам позже добавился новый одноклассник, а класса не было.
Посмотрим на текущие данные
[root@iz2ze76ybn73dvwmdij06zz ~]# cat students_store
Xiaoka 60 80 40 90 77 class-1
Yizhihua 70 66 50 80 90 class-1
kerwin 80 90 60 70 60 class-2
Fengzheng 90 78 62 40 62 class-2
xman - - - - - -
Fuzzy Match | Запрос учащихся, которые были помещены в класс
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '$0 ~/class/' students_store
Xiaoka 60 80 40 90 77 class-1
Yizhihua 70 66 50 80 90 class-1
kerwin 80 90 60 70 60 class-2
Fengzheng 90 78 62 40 62 class-2
Точное совпадение|Запрос учащихся в классе 1
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '$7=="class-1" {print $0}' students_store
Xiaoka 60 80 40 90 77 class-1
Yizhihua 70 66 50 80 90 class-1
Обратное соответствие | опрос учащихся, которые не учатся в 1 классе
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '$7!="class-1" {print $0}' students_store
kerwin 80 90 60 70 60 class-2
Fengzheng 90 78 62 40 62 class-2
xman - - - - - -
Сравните операции
Математика запроса больше 80
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '$2>60 {print $0}' students_store
Yizhihua 70 66 50 80 90 class-1
kerwin 80 90 60 70 60 class-2
Fengzheng 90 78 62 40 62 class-2
Математические запросы получают больше, чем оценки по английскому языку
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '$2 > $4 {print $0}' students_store
Xiaoka 60 80 40 90 77 class-1
Yizhihua 70 66 50 80 90 class-1
kerwin 80 90 60 70 60 class-2
Fengzheng 90 78 62 40 62 class-2
соответствует любому из указанных символов
Добавив список специальностей, давайте посмотрим на специальности Ханханов, и, кстати, назначим класс последнему новому ученику.
Тогда посмотрите на данные в это время.
[root@iz2ze76ybn73dvwmdij06zz ~]# cat students_store
Xiaoka 60 80 40 90 77 class-1 Java
Yizhihua 70 66 50 80 90 class-1 java
kerwin 80 90 60 70 60 class-2 Java
Fengzheng 90 78 62 40 62 class-2 java
xman - - - - - class-3 php
ИЛИ Сопоставление отношений | Запрос для учащихся 1 и 3 классов
root@iz2ze76ybn73dvwmdij06zz ~]# awk '$0 ~/(class-1|class-3)/' students_store
Xiaoka 60 80 40 90 77 class-1 Java
Yizhihua 70 66 50 80 90 class-1 java
xman - - - - - class-3 php
Совпадение любого символа | Вторая буква имени
Описание персонажа:
^ : начало поля или записи.
. : Любой символ.
root@iz2ze76ybn73dvwmdij06zz ~]# awk '$0 ~/(class-1|class-3)/' students_store
Xiaoka 60 80 40 90 77 class-1 Java
Yizhihua 70 66 50 80 90 class-1 java
xman - - - - - class-3 php
составное выражение
&& AND
отношения, должны быть удовлетворены в то же время~
Ищите детскую обувь с оценкой по математике выше 60 и по китайскому языку выше 60.
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '{ if ($2 > 60 && $3 > 60) print $0}' students_store
Yizhihua 70 66 50 80 90 class-1 java
kerwin 80 90 60 70 60 class-2 Java
Fengzheng 90 78 62 40 62 class-2 java
|| OR
Ищите детскую обувь с математикой выше 80 или языком выше 80.
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '{ if ($2 > 80 || $4 > 80) print $0}' students_store
Fengzheng 90 78 62 40 62 class-2 java
вывод в формате printf
В дополнение к выполнению функции, также важен красивый формат, поэтому отформатированный вывод будет выглядеть более удобным ~
грамматика
printf([формат], аргументы)
printf %x(format) специальный параметр x представляет определенный формат
символ | инструкция |
---|---|
- | Выровнять по левому краю |
Width | Шаг домена |
.prec | Максимальная длина строки или цифр справа от десятичной точки |
конвертер форматов
На самом деле он похож на другие языки.
Общие форматы
символ | описывать |
---|---|
%c | ASCII |
%d | целое число |
%o | восьмеричный |
%x | шестнадцатеричное число |
%f | число с плавающей запятой |
%e | Числа с плавающей запятой (научная запись) |
% s | нить |
%g | Решил использовать преобразование с плавающей запятой e/f |
Конкретный пример операции
ASCII-код 🐎
[root@iz2ze76ybn73dvwmdij06zz ~]# echo "66" | awk '{printf "%c\n",$0}'
B
число с плавающей запятой
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {printf "%f\n",100}'
100.000000
шестнадцатеричное число
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {printf "%x",996}'
3e4
Для большего количества операций, если вы заинтересованы, вы можете попробовать их одну за другой ~
встроенная переменная
Часто используемые встроенные переменные
NF: Запишите количество просматриваемых доменов, установленное после того, как запись будет прочитана.
NR : количество прочитанных записей.
FS : установить разделитель полей ввода
A R G C : количество параметров командной строки, которые можно передать из командной строки.
RS : разделитель управляющей записи
FIlENAME : имя файла, который в данный момент читается awk.
действовать
Вывод студенческих оценочных листов, подсчета полей и прочитанных записей.
[root@iz2ze76ybn73dvwmdij06zz ~]# awk '{print $0, NF , NR}' students_store
Xiaoka 60 80 40 90 77 class-1 Java 8 1
Yizhihua 70 66 50 80 90 class-1 java 8 2
kerwin 80 90 60 70 60 class-2 Java 8 3
Fengzheng 90 78 62 40 62 class-2 java 8 4
xman - - - - - class-3 php 8 5
встроенная функция
Общие функции
length(s) возвращает длину s
index(s,t) возвращает позицию первого вхождения строки t в s
match (s,r), содержит ли s строку r
split(s,a,fs) разбивает s на последовательность a на fs
gsub(r,s) замените r на s, диапазон будет полным текстом
gsub(r,s,t) В диапазоне t s заменяет r
substr(s,p) возвращает часть строки s, начинающуюся с p-й позиции (индекс считается с 1, можете попробовать сами)
substr(s,p,n) возвращает часть строки s n строк, начиная с p-й позиции
действовать
length
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {print length(" hello,im xiaoka")}'
16
index
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {print index("xiaoka","ok")}'
4
match
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {print match("Java小咖秀","va小")}'
3
gsub
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'gsub("Xiaoka","xk") {print $0}' students_store
xk 60 80 40 90 77 class-1 Java
substr(s,p)
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {print substr("xiaoka",3)}'
aoka
substr(s,p,n)
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN {print substr("xiaoka",3,2)}'
ao
split
[root@iz2ze76ybn73dvwmdij06zz ~]# str="java,xiao,ka,xiu"
[root@iz2ze76ybn73dvwmdij06zz ~]# awk 'BEGIN{split('"\"$str\""',ary,","); for(i in ary) {if(ary[i]>1) print ary[i]}}'
xiu
java
xiao
ka
awk-скрипт
Как упоминалось ранее, awk можно назвать небольшим языком программирования. Если команда относительно короткая, мы можем выполнить ее непосредственно в командной строке.Когда командная строка относительно длинная, мы можем использовать для ее обработки сценарий, который более удобочитаем, чем командная строка, а также может добавлять комментарии.
Напишите полный скрипт awk и выполните шаги
1. Сначала создайте файл awk
[root@iz2ze76ybn73dvwmdij06zz ~]# vim printname.awk
2. В первой строке скрипта должен быть указан интерпретатор
#!/usr/bin/awk -f
3. Напишите содержимое скрипта и напечатайте имя
[root@iz2ze76ybn73dvwmdij06zz ~]# cat printname.awk
#!/usr/bin/awk -f
#可以加注释了,哈哈
BEGIN { print "my name is Java小咖秀"}
4. Поскольку это скрипт, основные права доступа к исполняемому файлу установлены ~
[root@iz2ze76ybn73dvwmdij06zz ~]# chmod +x printname.awk
[root@iz2ze76ybn73dvwmdij06zz ~]# ll printname.awk
-rwxr-xr-x 1 root root 60 7月 1 15:23 printname.awk
5. Имея права на исполняемый файл, давайте запустим его и посмотрим результат
[root@iz2ze76ybn73dvwmdij06zz ~]# ./printname.awk
my name is Java小咖秀
Поняв этапы написания awk-скриптов, вы сможете сами написать волну~
Есть еще много связанного контента, позвольте мне поделиться им позже ~
В будущем я продолжу улучшать свое практическое руководство по работе с Linux, которое будет постоянно обновляться. . .
Спасибо, ребята, за вашу поддержку
Еще одна книга здесь сегодня, и она будет продолжать обновляться. . ⛽️
Ссылаться на
«Введение в awk»
«Командная строка Linux и сценарии оболочки»
«Частная кухня Linux брата Берда»
«Счастливая командная строка»
Энциклопедия Байду
В этой статье используетсяmdniceнабор текста