LINUX.ORG.RU

Сообщения Cave-Canem

 

Мне нужно на AWK то, ...

что делает на скорую руку написанная фигня на Bash'е:

(вывод ТОЛЬКО совпадающих по ЗАДАННОМУ полю строк)

(продолжение темы)

Файл (добавлена нумерация для наглядности):

  1 hello, y-cat!
  2 cat drank vodka
  3 mom washed frame
  4 dad drank vodka
  5 123 456 789
  6 Vova drowned
  7 vova fool
  8 cat drank vodka
  9 mom at work
 10 cat whore juvenile
 11 hello, www!
 12 petya the Fool
 13 dad washed frame
 14 Cat washed frame
 15 cat vodka drank
 16 cat drowned
 17 cat the Fool
 18 hello www!
Код:
#!/usr/bin/env bash

mapfile -O 1 a < <(cat "file" | nl | sort -k 2d)

i=0
f=0
for str in "${a[@]}"; do		
	
	(( i++ ))
	mapfile fr < <(printf %s "${a[i]}" | awk '{print $2"\n"$0}')
	mapfile sr < <(printf %s "${a[i+1]}" | awk '{print $2"\n"$0}')
		
	if [[ "${fr[0]}" == "${sr[0]}" ]]; then
		if (( f == 0 )); then
			f=1
			printf %s "${fr[1]}"
			printf %s "${sr[1]}"
		else
			printf %s "${sr[1]}"
		fi
	else
		f=0
	fi
done
Выхлоп:
      2 cat drank vodka
      8 cat drank vodka
     16 cat drowned
     17 cat the Fool
     15 cat vodka drank
     10 cat whore juvenile
      4 dad drank vodka
     13 dad washed frame
      9 mom at work
      3 mom washed frame

(Проблему с сортировкой заметили?)

Дальше

awk 'BEGIN {i = 1} {ff = $1; f_l = $0; getline ; sf = $1; s_l = $0} {if (ff == sf) a[i] = f_l; a[i+1] = s_l; i = i +2 } END { (for i in a) print a[i]} ' file
не продвинулся, я уже писал, что опыта с AWK у меня с гулькин х...

Грамотные, подскажите КАК?

 

Cave-Canem ()

AWK — Вывести все строки, совпадающие по полю $n

Всем: Здравствуйте!

Собственно сабж.

(Лучше бы для неотсортированного файла).

Что-то у меня не получается... (с awk практики очень мало).

P.S.

Нужно готовое решение, а не отсылки.

 

Cave-Canem ()

Враппер для mkdtemp — AWK?

И снова Здравствуйте!

Необходим враппер для mkdtemp, т.к. в OS X его нет, а есть mktemp с опцией "-d", выполнящий эту же функцию.

Проблема в том, что некоторые пакеты хотят именно mkdtemp.

Вроде простой путь так:

/usr/bin/awk 'sub("mkdtemp", "mktemp -d"){print}'

Но ума не приложу как awk передать строку!

И с awk-v, и с exec трахался — ничего не выходит!

А может есть какой-то другой способ, без awk?

Заранее благодарю и за желание помочь и ОСОБЕННО за помощь!

P.S.

Пожалуйста, просто напишите строчку/и кода.

 , , ,

Cave-Canem ()

ImageMagick convert [label:]

Привет!

Есть комманда:

/Path_to/convert \
-background LightBlue1 \
-border 10 \
-bordercolor red \
-font Helvetica-Bold-Oblique \
-fill blue \
-pointsize 72 \
label:\
"\n`date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S"`\n\n\
--Text!--" \
"/Users/user/Pictures/Test_Image.png"
Работает правильно (изображение создаётся —
identify /Users/user/Pictures/Test_Image.png
/Users/user/Pictures/Test_Image.png PNG 647x386 647x386+0+0 16-bit sRGB 45148B 0.000u 0:00.000
), но мне надо чтобы "--Text!--" печатался другими шрифтом, цветом и размером, нежели остальной текст .

КАК?

Заранее благодарен за помощь!

P.S.

convert --version
Version: ImageMagick 6.9.9-40 Q16 x86_64 2018-07-28 http://www.imagemagick.org
Copyright: © 1999-2018 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP 
Delegates (built-in): bzlib djvu fftw fontconfig freetype gslib jbig jng jp2 jpeg lcms ltdl lzma openexr png ps raw tiff webp x xml zlib

uname -a
Darwin Air.local 13.4.0 Darwin Kernel Version 13.4.0: Mon Jan 11 18:17:34 PST 2016; root:xnu-2422.115.15~1/RELEASE_X86_64 x86_64

 

Cave-Canem ()

trafshow — вообще ничего не выводит

Здравствуйте!

Пытаюсь посмотреть трафик в сети с помощью trafshow, ничего не выходит!

trafshow вообще ничего не выводит и блокирует вывод на ttys000:

1-0-4806 15:51:00 ES ~ >
trafshow -i en3
en3: en3: You don't have permission to capture on that device ((cannot open BPF device) /dev/bpf0: Permission denied)
No packet capture device available (no permission?)

2-0-4805 15:51:18 ES ~ >
sudo !!
sudo trafshow -i en3 
Password:
Вторая попытка:
2-0-4807 14:58:25 ES ~ >
sudo trafshow -i en3 -n net 10.0.1.3 mask 255.255.255.0
non-network bits set in "10.0.1.3 mask 255.255.255.0"
Третья попытка:
sudo trafshow -i en3 -n net 10.0.1.1 mask 255.255.255.0
non-network bits set in "10.0.1.1 mask 255.255.255.0"

( О себе: )

( en3: )

( man trafshow )

Вопрос: ЧЯДНТ, как это исправить?

Заранее благодарен за ответы и помощь!

P.S.

Вопрос не по теме:

Как сделать так, чтобы ответы приходили на почту?

 

Cave-Canem ()

rsync --exclude vs --filter

Здравствуйте!

Что правильне (лучше):

sudo rsync -rlt -ihv8 \
--ignore-existing --progress --stats --log-file=./rsync_log.txt \
--exclude="/2015/***" \
"/Volumes/Data/Fotko.photoslibrary/Masters/" "/Volumes/Фотоархив/Masters/" \
2> ./rsync_err.txt | tee ./rsync_out.txt
или
sudo rsync -rlt -ihv8  \
--ignore-existing --progress --stats --log-file=./rsync_log.txt  \
--filter="-/_/Volumes/Data/Fotko.photoslibrary/Masters/2015" \
 "/Volumes/Data/Fotko.photoslibrary/Masters/" "/Volumes/Фотоархив/Masters/" \
2> ./rsync_err.txt | tee ./rsync_out.txt
Нужно собственно исключить из копирования фолдер «/Volumes/Data/Fotko.photoslibrary/Masters/2015» в корне (со всем его содержимым) и только его.

Проверять возможности нет, надо с первого раза.

 

Cave-Canem ()

awk — вывод заданного поля СТРОГО из строки следующей за найденой строкой

Есть вот такое:

sudo gpt show disk4
Password:
start       size  index  contents
          0          1         PMBR
          1          1         Pri GPT header
          2         32         Pri GPT table
         34          6         
         40     409600      1  GPT part - "EFI System Partition"
     409640  976101344      2  GPT part - ""
  976510984     262151         
  976773135         32         Sec GPT table
  976773167          1         Sec GPT header      
Надо:

Найти строку, где ТРЕТЬЕ поле == 2, затем сложить значение из ВТОРОГО поля этой строки с значение из ВТОРОГО поля СЛЕДУЮЩЕЙ строки, сумму целочисленно разделить на 8, затем умножить на 8, результат напечатать.

Найти строку просто:

sudo gpt show disk0 | awk '$3 == 2 {print $2}'
А вот как в ТОМ ЖЕ проходе пулучить значение нужного поля СЛЕДУЮЩЕЙ строки — ума не приложу...

По идее нужно значение NR найденной строки сохранить и использовать для вывода нужного поля строки с увеличенным на еденицу NR.

Но вот реализовать это за ОДИН проход у меня не получается, хотя уверен что есть простое решение.

С awk дел практически не имел, так что не судите строго.

Помогите пожалуйста!

P.S.

Нужно это что бы автоматизировать вот такой однострочный скриптик:

sudo /usr/bin/true; diskutil unmountDisk force disk4 && (sudo gpt remove -i 2 disk4 && diskutil unmountDisk force disk4 && sudo gpt add -b 409640 -i 2 -s 976363488 -t "48465300-0000-11AA-AA11-00306543ECAC" disk4 && sudo fsck_hfs -fy /dev/disk4s2 && diskutil mount /dev/disk4s2) && (echo; echo "O'K"; echo; diskutil renameVolume /dev/disk4s2 "PhotoArchive") || echo; echo "Wrong..."

 ,

Cave-Canem ()

ruby from command-line — не получается передать переменную из bash

Здравствуйте!

Что-то я совсем туплю:

a = 42
b = ( a / 8 ) * 8
puts b.to_s
40
Естественно — работает. Надо:
a=42 
b=$(echo ${a} | ruby -e 'А вот что здесь надо написать, убей бог — не понимаю!')
Например так извращался:
a=42; b=$(echo ${a} | ruby -ep 'c = ( #{a} / 8 ); puts c.to_s')
Конечно не работает.

Помогите скорбному умом, ПОЖАЛУЙСТА!

 ,

Cave-Canem ()

Ruby, Bash и find

Здравствуйте!

Есть строка str:

irb
irb(main):001:0> str = %x(find "/NV" -name "*.txt" -print0)
=> "/NV/EFI_UUID.txt\u0000/NV/EFI_UUID_little-endian.txt\u0000/NV/nvram.txt\u0000/NV/nvram1.txt\u0000"
irb(main):002:0> exit
Надо разбить строку str на подстроки (где в качестве разделителя используется «\u0000») и поместить их в массив arr.

Как это сделать? (Если что, то я — Newbie).

Заранее благодарен за помощь!

 , ,

Cave-Canem ()

Ruby: Доступ к элементу вложенного массива

Здравствуйте!

irb
irb(main):001:0> a = [[36.6]]
=> [[36.6]]
irb(main):002:0> begin # Вот так не работает
irb(main):003:1* b = a[0[0]]
irb(main):004:1> end
=> [36.6]
irb(main):005:0> begin # А так работает
irb(main):006:1* b = a[0]
irb(main):007:1> c = b[0]
irb(main):008:1> end
=> 36.6
irb(main):009:0> exit
И вот так работает:
irb
irb(main):001:0> a = [[36.6]]
=> [[36.6]]
irb(main):002:0> a.flatten!
=> [36.6]
irb(main):003:0>  b = a[0]
=> 36.6
irb(main):004:0> exit

Что я делаю не так, как правильно? (Извините за ламерский вопрос).

 

Cave-Canem ()

Ошибка (моя) в File.size(fname)

Здравствуйте!

#!/usr/local/MacPorts/bin/ruby2.4

fname = "/Volumes/RAM/hosts"

size = File.size(fname)
puts size.to_s
709

Работает!

#!/usr/local/MacPorts/bin/ruby2.4

puts "Имя Файла? > "
fname = gets.chomp
puts fname

size = File.size(fname)
puts size.to_s
/Volumes/RAM/untitled.rb

Имя Файла? >

«/Volumes/RAM/hosts»

«/Volumes/RAM/hosts»

/Volumes/RAM/untitled.rb:7:in `size': No such file or directory @ rb_file_s_size - «/Volumes/RAM/hosts» (Errno::ENOENT) from /Volumes/RAM/untitled.rb:7:in `<main>'

Не работает!

ЧЯДНТ?

 

Cave-Canem ()

Странное поведение mapfile в BASH

Здравствуйте!

Преамбула:

cat ./ddd
первая строка
вторая строка

четвёртая строка

шестая строка
Амбула:
mapfile b < <(cat ./ddd)
echo ${#b[@]}
6
А вот тут засада:
i=0; for n in ${b[@]}; do echo $((i+1)) ${b[i]}; ((++i)); done
1 первая строка
2 вторая строка
3
4 четвёртая строка
5
6 шестая строка
7
8
Откуда две лишние строки? (С реальным файлом из 17 строк получил 79 строк, с 18 по 79 — пустые).

ЧЯДНТ?

 

Cave-Canem ()

crc32, ascci to bin, big-endian to little-endian

Здравствуйте!

Нужно преобразовать вывод команды src32 в binary little-endian и записать в файл.

Как это сделать?

Заранее благодарен!

 , ,

Cave-Canem ()

GPT, UUID и CRS32

Здравствуйте!

Возникла необходимость изменить UUID в LBA2 (по смещению 0x10) в Pri GPT table и, соответственно в Sec GPT table. В принципе я могу это сделать, но не знаю как подсчитать CRC32 of header и CRC32 of partition array (обе по четыре байта) в GPT header (LBA1).

Имеющаяся в OS X утилита CRS32 если я считаю контрольную сумму с обнулёнными 4 байтами по смещению 0x10 в LBA1 даёт не соответствующий результат.

Вопрос:

ЧЯДНТ и как победить?

Заранее благодарен за помощь!

P.S.

Это нужно т.к. в NVRAM в частности записано:

efi-apple-recovery <array><dict><key>IOMatch</key><dict><key>IOProviderClass</key><string>IOMedia</string><key>IOPropertyMatch</key><dict><key>UUID</key><string>92C9B4A1-7CC2-4841-9EAC-C19FF21B06EB</string></dict></dict><key>BLLastBSDName</key><string>disk0s1</string></dict><dict><key>IOEFIDevicePathType</key><string>MediaFilePath</string><key>Path</key><string>\EFI\APPLE\FIRMWARE\MBA41_0077_B15_LOCKED.scap</string></dict></array>%00

мне нужно заменить SSD, а терять возможность восстановления при сбое в BootROM не хочеться, а как БЕЗОШИБОЧНО переписать эту переменную в NVRAM я не знаю, а экспериментировать стрёмно.

 , , ,

Cave-Canem ()

Расшифруйте команду пожалуйста! - Perl

Здравствуйте!

В perl АБСОЛЮТНЫЙ профан, но вот возникла настоятельная надобность:

Есть вот такая команда:

sudo perl -pi -e 's|(^\x00{1,20})[^\x00]{9}(\x00{1,20}\x54)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage

В прнципе она должна найти и заменить последовательность в файле на нули, но есть некоторые вопросы:

1. Что делают option -p и -i?

2. Какая последовательность ищется?

3. Как видоизменить команду, что бы она ПРОСТО ВЫВЕЛА найденную строку?

Заранее благодарен за помощь!

 ,

Cave-Canem ()

rsync и hard link — параметр --link-dest=/PATHTOBACKUP — [Решено]

Здравствуйте!

Преамбула:

mkdir /TEST
cd /TEST
for i in {a..c}; do : > $i; done
Скрипт:
#!/usr/local/bin/bash

SOURCE="/TEST"
PATHTOBACKUP="/Volumes/BackUp"

date=`date "+%Y-%m-%dT%H:%M:%S"`
rsync -az --link-dest=$PATHTOBACKUP/current $SOURCE $PATHTOBACKUP/back-$date
unlink ${PATHTOBACKUP}/current
ln -s  $PATHTOBACKUP/back-$date ${PATHTOBACKUP}/current
Амбула:

При первом запуске скрипта всё предсказуемо:

--link-dest arg does not exist: /Volumes/BackUp/current
unlink: /Volumes/BackUp/current: No such file or directory
После повторного запуска:
ls -l /Volumes/BackUp/back-2017-03-05T14:19:44/TEST/a
-rw-r--r--  1 ES  wheel  0  5 мар 14:01 /Volumes/BackUp/back-2017-03-05T14:19:44/TEST/a
ls -i1 /Volumes/BackUp/back-2017-03-05T14:14:48/TEST/a
14083 /Volumes/BackUp/back-2017-03-05T14:14:48/TEST/a
ls -i1 /Volumes/BackUp/back-2017-03-05T14:19:44/TEST/a
14091 /Volumes/BackUp/back-2017-03-05T14:19:44/TEST/a
Т.е. ЖЁСТКИЕ ССЫЛКИ НЕ СОЗДАЮТСЯ, а по-новой копируются файлы.

Что я делаю не так?

P.S.

О себе:

Darwin Kernel Version 13.4.0: Mon Jan 11 18:17:34 PST 2016; root:xnu-2422.115.15~1/RELEASE_X86_64
rsync  version 3.1.2  protocol version 31
GNU bash, версия 4.4.12(1)-release (x86_64-apple-darwin13.4.0)

 ,

Cave-Canem ()

Чтение в массив из stdin

Здравствуйте!

Например:

declare -a a
echo -n {1..3} | xargs -n 1 | mapfile a
echo ${a[@]}

Не работает.
echo -n {1..3} | xargs -n 1 | /usr/bin/read -a a
echo ${a[@]}

Так же не работает.
mapfile a
1 
2 
3
^D
echo ${a[@]}
1 2 3
echo ${a[1]}
2
Работает.

Что я делаю не так?

 , ,

Cave-Canem ()

XOR для N переменных

Собственно сабж.

Сделал так:

function XORN()
{
	a=0
	while (($#)); do
		(( a = a + ! ! ${1} ))
		shift
	done
	echo $((( a = a % 2 )))
}

Работает, но интуитивно чувствую, что можно изящнее.

Как?

 ,

Cave-Canem ()

Проблемы с Ruby в OS X

Здравствуйте!

uname -a
Linux ubuntu16 4.4.0-45-generic #66-Ubuntu SMP Wed Oct 19 14:12:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
ruby --version
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
ruby -e 'puts Time.mktime(1812,11,16,00,00,00,000000000).to_i'
-4958418617
date --date='@-4958418617'
Пн ноя 16 00:00:00 LMT 1812
date
Чт окт 27 08:30:52 MSK 2016

В то же время:

uname -a
Darwin Air.local 13.4.0 Darwin Kernel Version 13.4.0: Mon Jan 11 18:17:34 PST 2016; root:xnu-2422.115.15~1/RELEASE_X86_64 x86_64
GNU bash, версия 4.4.0(1)-release (x86_64-apple-darwin13.4.0)
ruby --version
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin13
ruby -e 'puts Time.mktime( 1812, 11, 16, 00, 00, 00,   000000000 ).to_i'
-4958420400
date -r -4958420400
Sunday, November 15, 1812 23:30:17 (MMT)
date 
Tuesday, October 25, 2016 6:51:06 (MSK)
НО:
TZ=Europe/Moscow gdate +%s -d"1812-11-16 00:00:00" 
-4958418617 
TZ=Europe/Moscow date -r -4958418617 
понедельник, 16 ноября 1812 г. 00:00:00 (MMT)

Это баг Appe (/usr/share/zoneinfo) или я чего-то не понимаю?

P.S.

Не поделитесь ли фолдером /usr/share/zoneinfo?

Заранее благодарен!

Частное решение:

export TZ=UTC-3 
ruby -e 'puts Time.mktime(1812,11,16,00,00,00,000000000).to_i' 
- 4958420400 
date -r -4958420400 mon, 16 nov 1812 г. 00:00:00 (UTC) 
date 
27 okt 2016 г. 21:14:24 (UTC)

 , ,

Cave-Canem ()

Проблема с enhanced features в -regex утилиты “find”

Здравствуйте!

Пример проблемы:

: > 12; basename $(find -E . -regex '^(.*)(\d{2})' -print 2>/dev/null) не находит файл, basename $(find -E . -regex '^(.*)([0-9]{2})' -print 2>/dev/null) находит

В то же время, для примера, echo -e '12\nabc\n456' | grep -E -e '^(\d{3})' успешно справляется с задачей, хотя, по-видимому использует тот же regcomp()

Вопрос: что я делаю не так, и как победить (где что подкрутить)?

Заранее благодарен за помощь!

P.S. OS X, маны: regcomp(3), re_format(7), find(1)

UPD:

gfind . -regextype 'egrep' -regex '^(.*)(\d{2})' -print 2>/dev/null так же не работает, как впрочем и с любыми другими regular expression type

 , ,

Cave-Canem ()

RSS подписка на новые темы