grep, sed, awk эффективная обработка файлов 3 мечника

Linux
grep, sed, awk эффективная обработка файлов 3 мечника

Мы называем их тремя мушкетерами 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набор текста