Extrahera värden från terminalen via applescript till meddelanderuta?

Tråden skapades och har fått 16 svar. Det senaste inlägget skrevs .
1

Någon som skulle kunna hjälpa en UNIX- och applescriptnovis med detta lilla problem?

Söker en lösning, helst ett applescript, som plockar ut de fetmarkerade värdena från kommandona listade nedan, för att sedan presentera dessa tillsammans med lite förutbestämd text i enkel meddelanderuta enligt bifogad skiss.

Min tacksamhet och cred i distributionen (en gratisgrej som endast kommer att bestå av scriptet och en textbeskrivning för tillämpningen) är det jag kan ge som betalning

Kommando till värde ett: ifconfig en1

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::216:cbff:fe02:412e%en1 prefixlen 64 scopeid 0x5 
        inet xxx.xxx.xxxx.xxx netmask 0xffffff00 broadcast 192.168.200.255
        ether 00:16:cb:02:41:2e 
        media: autoselect status: active
        supported media: autoselect

Kommando till värde två: dig

;; Query time: 59 msec
;; SERVER: 194.218.166.20#53(xxx.xxx.xxx.xxx)
;; WHEN: Fri Dec 22 10:14:15 2006
;; MSG SIZE  rcvd: 436

Vet inte alls om de är smidigast eller fungerar i ditt fall, men de kankse är en början:

ifconfig |grep "inet " | cut -c 6-20

dig www.doman.se |grep SERVER |cut -c 28-39

Applescript och terminalen (hur du läser av saker från terminalen):
http://developer.apple.com/technotes/tn2002/tn2065.html

Applescript och textmanipulering
http://www.apple.com/applescript/guidebook/sbrt/pgs/sbrt.07.htm

Sista exemplet på denna sida innehåller sedan en generell rutin som används jämt och ständigt just för att dela upp textsnuttar i "items" (dvs listor).

Applescript saknar nämligen vissa textmanipuleringskommandon som man är van vid i andra språk, så du får göra något i stil med att först sätta applescript text item delimiter (förkortas TID) till "inet ", sedan dela upp texten med set the item_list to every text item of this_text vilket gör att du får två "items", den senare innehåller resten.

Sätt sedan TID till " netmask" och dela upp andra itemet från första steget ovan och vips har du kvar endast IP-numret. Omvandla sedan det itemet till en vanlig textvariabel så är du hemma.

Behöver du mera hjälp så fråga.

Notera att man även brukar återställa TID till "" när man är klar.

Edit: Länktips: http://developer.apple.com/referencelibrary/GettingStarted/GS_AppleScript/index.html

Ursprungligen av Taz_1999:

Behöver du mera hjälp så fråga.

Notera att man även brukar återställa TID till "" när man är klar.

Har tittat igenom sidorna du tipsade om och har tyvärr insett att jag kommer få hjärnblödning långt innan jag förstår vad de skriver om. Har vid tidigare tillfällen försökt lära mig C++ och senare applescript, men min arma hjärna fixar det inte alls. Jag tar tacksamt emot alla tips och hjälp jag kan få

Med det första kommandot fick jag fem rader med interna IP-nummer av olika slag, och det andra kommandot gav ett avhugget "3(194.218.16" (såvida man ska kunna klippa och klistra, vilket kanske inte är fallet). Det är mycket möjligt att detta pekar åt en fungerande lösning, men då jag inte vet ens vad kommandona utför så vet jag inte hur jag ska gå vidare

Slutlösningen är tänkt att vara så pass självgående att användaren bara ska behöva dubbelklicka på en fil för att fram värdena.

Tackar för informationen Taz, ska ta en titt!

  • Medlem
  • Örebro
  • 2006-12-22 15:24

Fullt förståeligt :|

Tack till herr oskob ovan som bakom kulisserna har skrivit en applescriptscriptlösning med hjälp av infot i tråden. Kommer relaterat till detta inom kort släppa en liten grej som viss grupp spelglada människor kan ha nytta av. Spänningen är olidlig

Och varför är du offline på iChat när jag är som mest nyfiken på vad detta är?

Ser nu att du skrev att du var applescript-novis, sorry, mitt svar var inte avsett för noviser.

I Applescript finns något som kallas för listor. Exempel:

set aListOfStuff to {"En", " svart", " katt", " satt", " på", " en", " väg"}. Denna lista består av textsnuttar. Man kan i en lista blanda datatyper sålunda och även ha listor i andra listor:

set aListOfStuff to {"En svart katt satt på en väg", 12, 2006-12-01, {"Banan", "Apelsin", "Äpple"}}

Man kan "hämta" en grej ur en lista sålunda:

get item 2 of list aListOfStuff

--> "En svart katt satt på en väg"

Vad är då Applescript's text item delimiter då? Jo, man kan nämligen be Applescript att dela upp något i en lista. Det tecken som då används som "delare" är just Applescript's text item delimiter.

Exempel:

set someString to "En% svart% katt% satt% på% en% väg"
set AppleScript's text item delimiters to "%"
set someStringAsList to every text item of someString
--> {"En", " svart", " katt", " satt", " på", " en", " väg"}

Man kan sedan sätta ihop en lista med strängar till en sträng igen genom att använda sig av:

set someString to "En% svart% katt% satt% på% en% väg"
set AppleScript's text item delimiters to "%"
set someStringAsList to every text item of someString
set AppleScript's text item delimiters to ""
set someStringAsListAsStringAgain to someStringAsList as string
--> "En svart katt satt på en väg"

Noter att jag sätter delimitern till en tom sträng igen, annars skulle Applescript returnera detta:

--> "En% svart% katt% satt% på% en% väg"

Vad har man då för nytta av detta? Jo, detta är Applescripts sök och ersätt!

Så om jag då tex skulle vilja ersätta "svart" med "grå" i texten ovan, så kan jag alltså göra så här:

set someString to "En svart katt satt på en väg"
set AppleScript's text item delimiters to "svart" -- Ordet jag vill ha bort
set someStringAsList to every text item of someString
set AppleScript's text item delimiters to "grå" -- Ordet jag vill ersätta det med
set someStringAsListAsStringAgain to someStringAsList as string
--> "En grå katt satt på en väg"

I ditt fall så kan du alltså göra något liknande, antag att du har den där snutten i en text som innehåller "Inet " före ipnumret och " netmask " efteråt. Man tar alltså och delar först upp den långa strängen i två delar med "Inet " som delare, då får du två strängar, den andra objektet i listan innehåller ip-numret och lite skräp efteråt.

Tag och omvandla det andra objektet till en sträng, dela upp det i en lista igen, men denna gång med " netmask" som delare. Då får du igen en lista med två saker i, men i denna lista är ip-numret du är på jakt efter det första objektet i listan.

Så här kan det se ut:

set someString to "en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::216:cbff:fe02:412e%en1 prefixlen 64 scopeid 0x5
inet xxx.xxx.xxxx.xxx netmask 0xffffff00 broadcast 192.168.200.255
ether 00:16:cb:02:41:2e
media: autoselect status: active
supported media: autoselect"
set AppleScript's text item delimiters to "inet " -- Första delaren
set someStringAsList to every text item of someString
set someString to second item of someStringAsList as string -- hämta andra objektet i listan
set AppleScript's text item delimiters to " netmask " -- Andra delaren
set someStringAsList to every text item of someString
set someStringAsList to first item of someStringAsList as text -- hämta första objektet i listan
-->"xxx.xxx.xxxx.xxx"

Var jag tydligare nu? Nästa inlägg, handlar om hur du får tag i resultatet av att köra ett terminalkommando.

Första raden kör terminalkommandot och får resultatet in i en variabel, splitta den som jag beskrivit ovan, kör andra terminalkommandot, splitta detta omkring "(" och ")". Kvar blir dina två IP-nr sålunda:

-- Tag reda på IP-nummer 1
set someString1 to do shell script "ifconfig en0" -- Jag har bara ett ethernetinterface...
set AppleScript's text item delimiters to "inet " -- Första delaren
set someString1AsList to every text item of someString1
set someString1 to second item of someString1AsList as string -- hämta andra objektet i listan
set AppleScript's text item delimiters to " netmask " -- Andra delaren
set someString1AsList to every text item of someString1
set someString1AsList to first item of someString1AsList as text -- hämta första objektet i listan

-- Tag reda på IP-nummer 2
set someString2 to do shell script "dig"
set AppleScript's text item delimiters to "(" -- Första delaren
set someString2AsList to every text item of someString2
set someString2 to second item of someString2AsList as string -- hämta andra objektet i listan
set AppleScript's text item delimiters to ")" -- Andra delaren
set someString2AsList to every text item of someString2
set someString2AsList to first item of someString2AsList as text -- hämta första objektet i listan
-- Sätt ihop det hela till en sträng, visa den.
get "IP-nr 1: " & someString1AsList & " IP-nr 2: " & someString2AsList

--> "IP-nr 1: 192.168.0.69 IP-nr 2: 195.43.255.203"

Det här är lite beroende på vilka svar de olika shell-kommandona ger, men det här funkar hos mig

display alert ("Det första numret är: " & word 2 of paragraph 3 of (do shell script " ifconfig en1") & return & return & "Det andra numret är: " & last word of paragraph -4 of (do shell script " dig"))
  • Medlem
  • Örebro
  • 2006-12-23 14:38

Taz:
Såhär löste jag det.

set term1 to do shell script "ifconfig en1 |grep \"inet \" | cut -c 7-99"

set AppleScript's text item delimiters to {" "}
set value1 to first text item of term1 
set AppleScript's text item delimiters to {""}

set term2 to do shell script "dig |grep \"(\""

set AppleScript's text item delimiters to {"("}
set value2 to last text item of term2
set AppleScript's text item delimiters to {")"}
set value2 to first text item of value2

set AppleScript's text item delimiters to {""}

Hade dock aldrig klarat det utan dina länkar i första inlägget. Tack!

Om nu bara Gristofer kan komma och godkänna skiten.

  • Medlem
  • Örebro
  • 2006-12-24 00:42

Richard:
Din kod fungerar inte här. Värde 1 blir "fe80". De där terminalkommandona verkar ge lite olika resultat beroende på humör. Jag måste t.ex. sätta på min internetdelning för att terminalen ska visa den data man vill åt över huvud taget.

Tack till alla som hjälpt till, samt en extra guldstjärna till Taz för den utförliga förklaringen!

  • Medlem
  • Örebro
  • 2006-12-28 16:10

Får inte ag någon guldstjärna? :|

  • Medlem
  • Örebro
  • 2006-12-28 16:11

Får inte ag någon guldstjärna? :|

1
Bevaka tråden