удалить строки из файла

L
На сайте с 13.01.2011
Offline
125
2010

Есть список путей до архивов бекапов в файле 1.txt


/opt/ftptempdir/nov/nov-2017-05-18.tar.gz
/opt/ftptempdir/nov/nov-2017-05-19.tar.gz
/opt/ftptempdir/nov/nov-2017-05-20.tar.gz
/opt/ftptempdir/nov/nov-2017-05-21.tar.gz
/opt/ftptempdir/nov/nov-2017-05-22.tar.gz
/opt/ftptempdir/nov/nov-2017-05-23.tar.gz
/opt/ftptempdir/nov/nov-2017-05-24.tar.gz
/opt/ftptempdir/admin/admin-2017-05-21.tar.gz
/opt/ftptempdir/admin/admin-2017-05-22.tar.gz
/opt/ftptempdir/admin/admin-2017-05-23.tar.gz
/opt/ftptempdir/admin/admin-2017-05-24.tar.gz

где nov и admin - это название папок имен пользователей isp - их может много и т.д.

нужно удалить из файла последние 3 строки архивов каждого пользователя

удалить последние 3 строки из конца файла можно командой


sed -n -e :a -e '1,3!{P;N;D;};N;ba' 1.txt

а как же удалить по каждому пользователю ? подскажите пожалуйста

Контакты-icq 535609 ()
DV
На сайте с 01.05.2010
Offline
644
#1

Файл 1.txt рядом со сриптом

Проверьте, чтобы шебанг был правильный, у меня под FreeBSD.

#!/bin/sh
cut_num() {
let QUANTITY=$1-3 > /dev/null
cat 1.txt | grep $2 | sort -u | sed ${QUANTITY}q
}
FILE_CONT=`cat 1.txt| sort -u`
SAVEIFS=$IFS
IFS='
'
let COUNT=0 > /dev/null
for CURRENT_FILE in ${FILE_CONT}; do
CURRENT_USER=`echo ${CURRENT_FILE} | awk -F\/ '{print $4}'`
if [ "${CURRENT_USER}" != "${LAST_USER}" -a ${LAST_USER} ]; then
CUTTED=`cut_num ${COUNT} ${LAST_USER}` > /dev/null
for READY_STRING in ${CUTTED}; do
echo ${READY_STRING}
done
let COUNT=0 > /dev/null
fi
let COUNT=${COUNT}+1 > /dev/null
LAST_USER=${CURRENT_USER}
done
CUTTED=`cut_num ${COUNT} ${CURRENT_USER}` > /dev/null
IFS=$SAVEIFS
for READY_STRING in ${CUTTED}; do
echo ${READY_STRING}
done
VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
L
На сайте с 13.01.2011
Offline
125
#2

не работает - падает

1.sh: line 12: [: предполагается что будет использован аргумент
sed: неверный ключ — «2»
DV
На сайте с 01.05.2010
Offline
644
#3

Перепишите строчку

cat 1.txt | grep $2 | sort -u | sed ${QUANTITY}q

как

cat 1.txt | grep $2 | sort -u | sed "${QUANTITY}"q

---------- Добавлено 25.05.2017 в 11:44 ----------

Если будут ещё проблемы, сразу напишите, что за система.

---------- Добавлено 25.05.2017 в 12:01 ----------

Можно так же переписать

if [ "${CURRENT_USER}" != "${LAST_USER}" -a ${LAST_USER} ]; then

как

if [ "${CURRENT_USER}" != "${LAST_USER}" -a -n "${LAST_USER}" ]; then

Теперь и в cygwin нормально работает.

---------- Добавлено 25.05.2017 в 12:20 ----------

Получается

#!/bin/sh

cut_num() {
let QUANTITY=$1-3 > /dev/null
cat 1.txt | grep $2 | sort -u | sed "${QUANTITY}"q
}
FILE_CONT=`cat 1.txt| sort -u`
SAVEIFS=$IFS
IFS='
'
let COUNT=0 > /dev/null
for CURRENT_FILE in ${FILE_CONT}; do
CURRENT_USER=`echo ${CURRENT_FILE} | awk -F\/ '{print $4}'`
if [ "${CURRENT_USER}" != "${LAST_USER}" -a -n "${LAST_USER}" ]; then
CUTTED=`cut_num ${COUNT} ${LAST_USER}` > /dev/null
for READY_STRING in ${CUTTED}; do
echo ${READY_STRING}
done
let COUNT=0 > /dev/null
fi
let COUNT=${COUNT}+1 > /dev/null
LAST_USER=${CURRENT_USER}
done
CUTTED=`cut_num ${COUNT} ${CURRENT_USER}` > /dev/null
IFS=$SAVEIFS
for READY_STRING in ${CUTTED}; do
echo ${READY_STRING}
done
L
На сайте с 13.01.2011
Offline
125
#4

DenisVS да спасибо! все работает - это я ошибся при копировании.

цель была смонтировать удаленный ftp через curlftpfs (на который льются бекапы) в локальную папку - и вывести список архивов в 1.txt , вывести список котор надо удалить в 2.txt и грохнуть

$CAT $BACKUPDIR/2.txt | xargs rm

mtime не походит - потому что если бекапы перестанут делаться по какой то причине - они будут все удалены - а тут полюбому останется 3

но если бекапов уже храниться 3 - то sed получает 0 и 2.txt пустой


/opt/test/1.sh: line 14: [: предполагается что будет использован аргумент
sed: -e выражение #1, символ 2: недопустимое использование строки адреса 0
sed: -e выражение #1, символ 2: недопустимое использование строки адреса 0
rm: пропущен операнд
По команде «rm --help» можно получить дополнительную информацию

хотя на следующий день будет 4 - и это неважно

а как вывести вывод этого скрипта в 2.txt - кроме как 1.sh > 2.txt ?

DV
На сайте с 01.05.2010
Offline
644
#5

В самом скрипте перенаправить в 2 местах

echo ${READY_STRING} >> 2.txt

Перед этим сделать

touch 2.txt

L
На сайте с 13.01.2011
Offline
125
#6

в итоге получился скриптик - заходит на ftp и ротирует бекапы -оставляет последние 3


touch ~/.netrc
chmod 600 ~/.netrc
cat ~/.netrc
machine 192.168.1.1
login user
password pass

#!/bin/bash
### yum/apt-get install curlftpfs

function die () {
echo >&2 "$@"
exit 1
}

XARGS="$(which xargs)"
CAT="$(which cat)"
SED="$(which sed)"
FIND="$(which find)"
BACKUPDIR=/opt/testbak
FTPHOST[0]="192.168.1.1"
#FTPUSER[0]="login"
#FTPPASS[0]="pass"
FTPDIR[0]="bak"
FTPTEMPDIR[0]="/opt/ftptempdir"

if [[ ! -d $BACKUPDIR ]]
then
mkdir -p "$BACKUPDIR"
fi

if [[ ! -d $FTPTEMPDIR ]]
then
mkdir -p "$FTPTEMPDIR"
fi

cd $BACKUPDIR
for KEY in "${!FTPHOST[@]}"; do
mount curlftpfs#ftp://${FTPHOST[$KEY]}/${FTPDIR[$KEY]}/ ${FTPTEMPDIR[$KEY]} -t fuse -o rw,noauto,default_permissions,user,disable_eprt,_netdev -o fsname=ftpbak
if [[ $? -gt 0 ]];then
echo "монтирование не удачно, выход."
exit 1
fi
echo "монтирование удачно"

#строим полный список файлов бекапа
$FIND ${FTPTEMPDIR[$KEY]} -name "*.tar.gz" -type f | sort -n > $BACKUPDIR/1.txt
touch $BACKUPDIR/2.txt

#удаляем из списка последние 3 бекапа
cut_num() {
let QUANTITY=$1-3 > /dev/null
cat $BACKUPDIR/1.txt | grep $2 | sort -u | sed "${QUANTITY}"q
}
FILE_CONT=`cat $BACKUPDIR/1.txt| sort -u`
SAVEIFS=$IFS
IFS='
'
let COUNT=0 > /dev/null
for CURRENT_FILE in ${FILE_CONT}; do
CURRENT_USER=`echo ${CURRENT_FILE} | awk -F\/ '{print $4}'`
if [ "${CURRENT_USER}" != "${LAST_USER}" -a -n "${LAST_USER}" ]; then
CUTTED=`cut_num ${COUNT} ${LAST_USER}` > /dev/null
for READY_STRING in ${CUTTED}; do
echo ${READY_STRING} >> $BACKUPDIR/2.txt
done
let COUNT=0 > /dev/null
fi
let COUNT=${COUNT}+1 > /dev/null
LAST_USER=${CURRENT_USER}
done
CUTTED=`cut_num ${COUNT} ${CURRENT_USER}` > /dev/null
IFS=$SAVEIFS
for READY_STRING in ${CUTTED}; do
echo ${READY_STRING} >> $BACKUPDIR/2.txt
done

#удаляем устаревшие бекапы
$CAT $BACKUPDIR/2.txt | $XARGS rm
rm -f $BACKUPDIR/1.txt
rm -f $BACKUPDIR/2.txt

# отмонтируем FTPTEMPDIR
umount ${FTPTEMPDIR[$KEY]}
done

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий