Nowe posty

Autor Wątek: Pobranie każdej linij pliku po kolej.  (Przeczytany 1727 razy)

NickOver

  • Gość
Pobranie każdej linij pliku po kolej.
« dnia: 2014-11-20, 08:38:54 »
Witam.
Chciałbym pobrać do zmiennej każdą linijkę pliku. Problem jest taki że będzie to działało w pętli, więc jak zrobic aby do zmiennej $page pobierała się najpierw pierwsza, potem druga, trzecia... 999 linijka?

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2757
  • 1709
    • Zobacz profil
Pobranie każdej linij pliku po kolej.
« Odpowiedź #1 dnia: 2014-11-20, 10:05:35 »
Moze szerzej opowiedz o tym co chcesz zrobic bo nie rozumiem jak mialo by to
wygladac i dzialac.
Bo jesli mialo by to dzialac w petli mozesz zrobic w podobny sposob
# pokaze Ci ile lini masz w pliku
echo "In file lista_ldd is : `cat -n ~/aRPM/lista_ldd | tail -1 | awk '{print $1}'` line"
ba=$(cat -n ~/aRPM/lista_ldd | tail -1 | awk '{print $1}')


  for i in `seq 1 $ba`
  do
       echo "rpm loop nr: $i"
       # pokaze Ci numer wykonywanej petli, czyli ktora to juz linia z pliku
       
# http://mywiki.wooledge.org/BashPitfalls
# for minimalize use "echo" here.
bb=$(awk 'NR=='$i ~/aRPM/lista_ldd)
                # Tu jest chyba twoja zmienna, sprawdz
                # Zmienna bb bedzie linia z pliku w zaleznosci od numeru "i"


        if echo $bb | grep -q "/"
then
        # "Slash exist"
    if echo $bb | grep -q "main"
    then  
         bb2=$(echo $bb |  cut -d " " -f 2-10)
         echo "Slash exist"
                  echo "main exist"
         bc=$(rpm -qf $bb2)
         echo "MAIN $bc" >> ~/aRPM/lista_ldd_rpm  
 
    else
         echo "Slash exist"
                  echo "main not exist"
         bc=$(rpm -qf $bb)
         echo $bc >> ~/aRPM/lista_ldd_rpm
    fi

else
#       "Slash not exist"
    echo "Slash not exist"
    echo "next_line - " >> ~/aRPM/exceptions_ldd

    echo $bb >> ~/aRPM/exceptions_ldd
   
    # map in " cat /proc/self/maps "
    # http://www.trilithium.com/johan/2005/08/linux-gate/
                fi

       
  done
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

NickOver

  • Gość
Pobranie każdej linij pliku po kolej.
« Odpowiedź #2 dnia: 2014-11-20, 14:30:01 »
Więc tak. Mam plik w którym sa adresy stron internetowych. Dla każdej z nich muszą być przeprowadzone testy które sa w folderze. Chodzi mi o to aby pobierało pierwszą linijke do zmiennej a następnie wykonują się wszystkie testy. Potem zmienna musi być nadpisywana przez zawartość 2 lijnijki i znów wszystkie testy... Oto kod:
#!/bin/bash
lock_file='itLives.lock'

if [ -e $lock_file ]
then
modtime=`stat -c %Y itLives.lock`
nowtime=`date +%s`
modtime=$((modtime+0))
nowtime=$((nowtime-900))

if [ $nowtime -gt $modtime ]
then
rm -f $lock_file
else
#         echo $lock_file
       exit 1;
fi
fi

touch $lock_file


all="ALL:ok"
results=""

pages= LINIJKA Z PLIKU PAGES.TXT

for test in `ls tests`
do
result=`tests/$test$pages`
if [ "$result" != "ok" ]
  then
all=""

if [ "$results" != "" ]
then
results=$results", "
fi

results=$results$test":"$result
fi
done

result=$all$results

lastResult=`cat lastResult.log 2> /dev/null`


#if [ "$lastResult" != "$result" ]
#then
#for notifications in `ls notifications`
#do
# notifications/$notifications "`date +%H:%M:%S`@`hostname`: $result"
#done

echo $result > lastResult.log
echo "`date` - $result" >> results.log
#fi

rm -f $lock_file
Mógłbyś dopisać do tego to pobieranie linijek? Jest to mój pierwszy skrypt w tym języku i srednio go rozumiem. Mogę się odwdzięczyć czyms w php'ie :D

alvaro

  • Gość
Pobranie każdej linij pliku po kolej.
« Odpowiedź #3 dnia: 2014-11-20, 17:27:38 »
Cytat: NickOver
Więc tak. Mam plik w którym sa adresy stron internetowych. Dla każdej z nich muszą być przeprowadzone testy które sa w folderze. Chodzi mi o to aby pobierało pierwszą linijke do zmiennej a następnie wykonują się wszystkie testy. Potem zmienna musi być nadpisywana przez zawartość 2 lijnijki i znów wszystkie testy... Oto kod:
#!/bin/bash
lock_file='itLives.lock'

if [ -e $lock_file ]
then
modtime=`stat -c %Y itLives.lock`
nowtime=`date +%s`
modtime=$((modtime+0))
nowtime=$((nowtime-900))

if [ $nowtime -gt $modtime ]
then
rm -f $lock_file
else
#         echo $lock_file
       exit 1;
fi
fi

touch $lock_file


all="ALL:ok"
results=""

pages= LINIJKA Z PLIKU PAGES.TXT

for test in `ls tests`
do
result=`tests/$test$pages`
if [ "$result" != "ok" ]
  then
all=""

if [ "$results" != "" ]
then
results=$results", "
fi

results=$results$test":"$result
fi
done

result=$all$results

lastResult=`cat lastResult.log 2> /dev/null`


#if [ "$lastResult" != "$result" ]
#then
#for notifications in `ls notifications`
#do
# notifications/$notifications "`date +%H:%M:%S`@`hostname`: $result"
#done

echo $result > lastResult.log
echo "`date` - $result" >> results.log
#fi

rm -f $lock_file
Mógłbyś dopisać do tego to pobieranie linijek? Jest to mój pierwszy skrypt w tym języku i srednio go rozumiem. Mogę się odwdzięczyć czyms w php'ie :D
Szkic skryptu mógłby wyglądać tak:
#!/usr/bin/env bash

cd "$(dirname $(readlink -f $0))"

# dla każdej linii w pliku "pages.txt"
while read -r line; do
  results=""
  # jeśli linia jest pusta to przejdź do następnej
  [[ "$line" == "" ]] && continue
  # dla każdego pliku w katalogu tests/
  for test in tests/*; do
    # jeśli podany plik nie jest plikiem wykonywalnym to przejdź do następnego
    [[ -x "$test" ]] || continue
    # przypisz wynik działania testu do zmiennej results
    result=$( "$test" "$line" 2> /dev/null )
    # alternatywnie można posłużyć się statusem wyjścia dla ostatniej komendy
    status="$?"
    # jeśli test wykonał się poprawnie to przejdź do następnego
    [[ "$result" == "ok" ]] && continue
    # dodaj wynik testu do wszystkich wyników
    [[ "$results" == "" ]] || results+=", "
    results+="$(basename $test):$result"
  done
  [[ "$results" == "" ]] && results="ALL:ok"
 
  # wypisanie wyników dla danego adresu
  echo "$line: $results"
done < "pages.txt"
wklejka